OLD | NEW |
1 # Copyright (c) 2006-2010 Mitch Garnaat http://garnaat.org/ | 1 # Copyright (c) 2006-2010 Mitch Garnaat http://garnaat.org/ |
2 # Copyright (c) 2010, Eucalyptus Systems, Inc. | 2 # Copyright (c) 2010, Eucalyptus Systems, Inc. |
3 # | 3 # |
4 # Permission is hereby granted, free of charge, to any person obtaining a | 4 # Permission is hereby granted, free of charge, to any person obtaining a |
5 # copy of this software and associated documentation files (the | 5 # copy of this software and associated documentation files (the |
6 # "Software"), to deal in the Software without restriction, including | 6 # "Software"), to deal in the Software without restriction, including |
7 # without limitation the rights to use, copy, modify, merge, publish, dis- | 7 # without limitation the rights to use, copy, modify, merge, publish, dis- |
8 # tribute, sublicense, and/or sell copies of the Software, and to permit | 8 # tribute, sublicense, and/or sell copies of the Software, and to permit |
9 # persons to whom the Software is furnished to do so, subject to the fol- | 9 # persons to whom the Software is furnished to do so, subject to the fol- |
10 # lowing conditions: | 10 # lowing conditions: |
(...skipping 14 matching lines...) Expand all Loading... |
25 """ | 25 """ |
26 | 26 |
27 import base64 | 27 import base64 |
28 import warnings | 28 import warnings |
29 from datetime import datetime | 29 from datetime import datetime |
30 from datetime import timedelta | 30 from datetime import timedelta |
31 import boto | 31 import boto |
32 from boto.connection import AWSQueryConnection | 32 from boto.connection import AWSQueryConnection |
33 from boto.resultset import ResultSet | 33 from boto.resultset import ResultSet |
34 from boto.ec2.image import Image, ImageAttribute | 34 from boto.ec2.image import Image, ImageAttribute |
35 from boto.ec2.instance import Reservation, Instance, ConsoleOutput, InstanceAttr
ibute | 35 from boto.ec2.instance import Reservation, Instance |
| 36 from boto.ec2.instance import ConsoleOutput, InstanceAttribute |
36 from boto.ec2.keypair import KeyPair | 37 from boto.ec2.keypair import KeyPair |
37 from boto.ec2.address import Address | 38 from boto.ec2.address import Address |
38 from boto.ec2.volume import Volume | 39 from boto.ec2.volume import Volume |
39 from boto.ec2.snapshot import Snapshot | 40 from boto.ec2.snapshot import Snapshot |
40 from boto.ec2.snapshot import SnapshotAttribute | 41 from boto.ec2.snapshot import SnapshotAttribute |
41 from boto.ec2.zone import Zone | 42 from boto.ec2.zone import Zone |
42 from boto.ec2.securitygroup import SecurityGroup | 43 from boto.ec2.securitygroup import SecurityGroup |
43 from boto.ec2.regioninfo import RegionInfo | 44 from boto.ec2.regioninfo import RegionInfo |
44 from boto.ec2.instanceinfo import InstanceInfo | 45 from boto.ec2.instanceinfo import InstanceInfo |
45 from boto.ec2.reservedinstance import ReservedInstancesOffering, ReservedInstanc
e | 46 from boto.ec2.reservedinstance import ReservedInstancesOffering |
| 47 from boto.ec2.reservedinstance import ReservedInstance |
46 from boto.ec2.spotinstancerequest import SpotInstanceRequest | 48 from boto.ec2.spotinstancerequest import SpotInstanceRequest |
47 from boto.ec2.spotpricehistory import SpotPriceHistory | 49 from boto.ec2.spotpricehistory import SpotPriceHistory |
48 from boto.ec2.spotdatafeedsubscription import SpotDatafeedSubscription | 50 from boto.ec2.spotdatafeedsubscription import SpotDatafeedSubscription |
49 from boto.ec2.bundleinstance import BundleInstanceTask | 51 from boto.ec2.bundleinstance import BundleInstanceTask |
50 from boto.ec2.placementgroup import PlacementGroup | 52 from boto.ec2.placementgroup import PlacementGroup |
51 from boto.ec2.tag import Tag | 53 from boto.ec2.tag import Tag |
52 from boto.exception import EC2ResponseError | 54 from boto.exception import EC2ResponseError |
53 | 55 |
54 #boto.set_stream_logger('ec2') | 56 #boto.set_stream_logger('ec2') |
55 | 57 |
56 class EC2Connection(AWSQueryConnection): | 58 class EC2Connection(AWSQueryConnection): |
57 | 59 |
58 APIVersion = boto.config.get('Boto', 'ec2_version', '2010-08-31') | 60 APIVersion = boto.config.get('Boto', 'ec2_version', '2011-01-01') |
59 DefaultRegionName = boto.config.get('Boto', 'ec2_region_name', 'us-east-1') | 61 DefaultRegionName = boto.config.get('Boto', 'ec2_region_name', 'us-east-1') |
60 DefaultRegionEndpoint = boto.config.get('Boto', 'ec2_region_endpoint', | 62 DefaultRegionEndpoint = boto.config.get('Boto', 'ec2_region_endpoint', |
61 'ec2.amazonaws.com') | 63 'ec2.amazonaws.com') |
62 ResponseError = EC2ResponseError | 64 ResponseError = EC2ResponseError |
63 | 65 |
64 def __init__(self, aws_access_key_id=None, aws_secret_access_key=None, | 66 def __init__(self, aws_access_key_id=None, aws_secret_access_key=None, |
65 is_secure=True, host=None, port=None, proxy=None, proxy_port=No
ne, | 67 is_secure=True, host=None, port=None, |
| 68 proxy=None, proxy_port=None, |
66 proxy_user=None, proxy_pass=None, debug=0, | 69 proxy_user=None, proxy_pass=None, debug=0, |
67 https_connection_factory=None, region=None, path='/'): | 70 https_connection_factory=None, region=None, path='/', |
| 71 api_version=None, security_token=None): |
68 """ | 72 """ |
69 Init method to create a new connection to EC2. | 73 Init method to create a new connection to EC2. |
70 | 74 |
71 B{Note:} The host argument is overridden by the host specified in the | 75 B{Note:} The host argument is overridden by the host specified in the |
72 boto configuration file. | 76 boto configuration file. |
73 """ | 77 """ |
74 if not region: | 78 if not region: |
75 region = RegionInfo(self, self.DefaultRegionName, | 79 region = RegionInfo(self, self.DefaultRegionName, |
76 self.DefaultRegionEndpoint) | 80 self.DefaultRegionEndpoint) |
77 self.region = region | 81 self.region = region |
78 AWSQueryConnection.__init__(self, aws_access_key_id, | 82 AWSQueryConnection.__init__(self, aws_access_key_id, |
79 aws_secret_access_key, | 83 aws_secret_access_key, |
80 is_secure, port, proxy, proxy_port, | 84 is_secure, port, proxy, proxy_port, |
81 proxy_user, proxy_pass, | 85 proxy_user, proxy_pass, |
82 self.region.endpoint, debug, | 86 self.region.endpoint, debug, |
83 https_connection_factory, path) | 87 https_connection_factory, path, |
| 88 security_token) |
| 89 if api_version: |
| 90 self.APIVersion = api_version |
84 | 91 |
85 def _required_auth_capability(self): | 92 def _required_auth_capability(self): |
86 return ['ec2'] | 93 return ['ec2'] |
87 | 94 |
88 def get_params(self): | 95 def get_params(self): |
89 """ | 96 """ |
90 Returns a dictionary containing the value of of all of the keyword | 97 Returns a dictionary containing the value of of all of the keyword |
91 arguments passed when constructing this connection. | 98 arguments passed when constructing this connection. |
92 """ | 99 """ |
93 param_names = ['aws_access_key_id', 'aws_secret_access_key', 'is_secure'
, | 100 param_names = ['aws_access_key_id', 'aws_secret_access_key', |
94 'port', 'proxy', 'proxy_port', 'proxy_user', 'proxy_pass'
, | 101 'is_secure', 'port', 'proxy', 'proxy_port', |
| 102 'proxy_user', 'proxy_pass', |
95 'debug', 'https_connection_factory'] | 103 'debug', 'https_connection_factory'] |
96 params = {} | 104 params = {} |
97 for name in param_names: | 105 for name in param_names: |
98 params[name] = getattr(self, name) | 106 params[name] = getattr(self, name) |
99 return params | 107 return params |
100 | 108 |
101 def build_filter_params(self, params, filters): | 109 def build_filter_params(self, params, filters): |
102 i = 1 | 110 i = 1 |
103 for name in filters: | 111 for name in filters: |
104 aws_name = name.replace('_', '-') | 112 aws_name = name |
| 113 if not aws_name.startswith('tag:'): |
| 114 aws_name = name.replace('_', '-') |
105 params['Filter.%d.Name' % i] = aws_name | 115 params['Filter.%d.Name' % i] = aws_name |
106 value = filters[name] | 116 value = filters[name] |
107 if not isinstance(value, list): | 117 if not isinstance(value, list): |
108 value = [value] | 118 value = [value] |
109 j = 1 | 119 j = 1 |
110 for v in value: | 120 for v in value: |
111 params['Filter.%d.Value.%d' % (i,j)] = v | 121 params['Filter.%d.Value.%d' % (i,j)] = v |
112 j += 1 | 122 j += 1 |
113 i += 1 | 123 i += 1 |
114 | 124 |
(...skipping 29 matching lines...) Expand all Loading... |
144 """ | 154 """ |
145 params = {} | 155 params = {} |
146 if image_ids: | 156 if image_ids: |
147 self.build_list_params(params, image_ids, 'ImageId') | 157 self.build_list_params(params, image_ids, 'ImageId') |
148 if owners: | 158 if owners: |
149 self.build_list_params(params, owners, 'Owner') | 159 self.build_list_params(params, owners, 'Owner') |
150 if executable_by: | 160 if executable_by: |
151 self.build_list_params(params, executable_by, 'ExecutableBy') | 161 self.build_list_params(params, executable_by, 'ExecutableBy') |
152 if filters: | 162 if filters: |
153 self.build_filter_params(params, filters) | 163 self.build_filter_params(params, filters) |
154 return self.get_list('DescribeImages', params, [('item', Image)], verb='
POST') | 164 return self.get_list('DescribeImages', params, |
| 165 [('item', Image)], verb='POST') |
155 | 166 |
156 def get_all_kernels(self, kernel_ids=None, owners=None): | 167 def get_all_kernels(self, kernel_ids=None, owners=None): |
157 """ | 168 """ |
158 Retrieve all the EC2 kernels available on your account. | 169 Retrieve all the EC2 kernels available on your account. |
159 Constructs a filter to allow the processing to happen server side. | 170 Constructs a filter to allow the processing to happen server side. |
160 | 171 |
161 :type kernel_ids: list | 172 :type kernel_ids: list |
162 :param kernel_ids: A list of strings with the image IDs wanted | 173 :param kernel_ids: A list of strings with the image IDs wanted |
163 | 174 |
164 :type owners: list | 175 :type owners: list |
165 :param owners: A list of owner IDs | 176 :param owners: A list of owner IDs |
166 | 177 |
167 :rtype: list | 178 :rtype: list |
168 :return: A list of :class:`boto.ec2.image.Image` | 179 :return: A list of :class:`boto.ec2.image.Image` |
169 """ | 180 """ |
170 params = {} | 181 params = {} |
171 if kernel_ids: | 182 if kernel_ids: |
172 self.build_list_params(params, kernel_ids, 'ImageId') | 183 self.build_list_params(params, kernel_ids, 'ImageId') |
173 if owners: | 184 if owners: |
174 self.build_list_params(params, owners, 'Owner') | 185 self.build_list_params(params, owners, 'Owner') |
175 filter = {'image-type' : 'kernel'} | 186 filter = {'image-type' : 'kernel'} |
176 self.build_filter_params(params, filter) | 187 self.build_filter_params(params, filter) |
177 return self.get_list('DescribeImages', params, [('item', Image)], verb='
POST') | 188 return self.get_list('DescribeImages', params, |
| 189 [('item', Image)], verb='POST') |
178 | 190 |
179 def get_all_ramdisks(self, ramdisk_ids=None, owners=None): | 191 def get_all_ramdisks(self, ramdisk_ids=None, owners=None): |
180 """ | 192 """ |
181 Retrieve all the EC2 ramdisks available on your account. | 193 Retrieve all the EC2 ramdisks available on your account. |
182 Constructs a filter to allow the processing to happen server side. | 194 Constructs a filter to allow the processing to happen server side. |
183 | 195 |
184 :type ramdisk_ids: list | 196 :type ramdisk_ids: list |
185 :param ramdisk_ids: A list of strings with the image IDs wanted | 197 :param ramdisk_ids: A list of strings with the image IDs wanted |
186 | 198 |
187 :type owners: list | 199 :type owners: list |
188 :param owners: A list of owner IDs | 200 :param owners: A list of owner IDs |
189 | 201 |
190 :rtype: list | 202 :rtype: list |
191 :return: A list of :class:`boto.ec2.image.Image` | 203 :return: A list of :class:`boto.ec2.image.Image` |
192 """ | 204 """ |
193 params = {} | 205 params = {} |
194 if ramdisk_ids: | 206 if ramdisk_ids: |
195 self.build_list_params(params, ramdisk_ids, 'ImageId') | 207 self.build_list_params(params, ramdisk_ids, 'ImageId') |
196 if owners: | 208 if owners: |
197 self.build_list_params(params, owners, 'Owner') | 209 self.build_list_params(params, owners, 'Owner') |
198 filter = {'image-type' : 'ramdisk'} | 210 filter = {'image-type' : 'ramdisk'} |
199 self.build_filter_params(params, filter) | 211 self.build_filter_params(params, filter) |
200 return self.get_list('DescribeImages', params, [('item', Image)], verb='
POST') | 212 return self.get_list('DescribeImages', params, |
| 213 [('item', Image)], verb='POST') |
201 | 214 |
202 def get_image(self, image_id): | 215 def get_image(self, image_id): |
203 """ | 216 """ |
204 Shortcut method to retrieve a specific image (AMI). | 217 Shortcut method to retrieve a specific image (AMI). |
205 | 218 |
206 :type image_id: string | 219 :type image_id: string |
207 :param image_id: the ID of the Image to retrieve | 220 :param image_id: the ID of the Image to retrieve |
208 | 221 |
209 :rtype: :class:`boto.ec2.image.Image` | 222 :rtype: :class:`boto.ec2.image.Image` |
210 :return: The EC2 Image specified or None if the image is not found | 223 :return: The EC2 Image specified or None if the image is not found |
211 """ | 224 """ |
212 try: | 225 try: |
213 return self.get_all_images(image_ids=[image_id])[0] | 226 return self.get_all_images(image_ids=[image_id])[0] |
214 except IndexError: # None of those images available | 227 except IndexError: # None of those images available |
215 return None | 228 return None |
216 | 229 |
217 def register_image(self, name=None, description=None, image_location=None, | 230 def register_image(self, name=None, description=None, image_location=None, |
218 architecture=None, kernel_id=None, ramdisk_id=None, | 231 architecture=None, kernel_id=None, ramdisk_id=None, |
219 root_device_name=None, block_device_map=None): | 232 root_device_name=None, block_device_map=None): |
220 """ | 233 """ |
221 Register an image. | 234 Register an image. |
222 | 235 |
223 :type name: string | 236 :type name: string |
224 :param name: The name of the AMI. Valid only for EBS-based images. | 237 :param name: The name of the AMI. Valid only for EBS-based images. |
225 | 238 |
226 :type description: string | 239 :type description: string |
227 :param description: The description of the AMI. | 240 :param description: The description of the AMI. |
228 | 241 |
229 :type image_location: string | 242 :type image_location: string |
230 :param image_location: Full path to your AMI manifest in Amazon S3 stora
ge. | 243 :param image_location: Full path to your AMI manifest in |
| 244 Amazon S3 storage. |
231 Only used for S3-based AMI's. | 245 Only used for S3-based AMI's. |
232 | 246 |
233 :type architecture: string | 247 :type architecture: string |
234 :param architecture: The architecture of the AMI. Valid choices are: | 248 :param architecture: The architecture of the AMI. Valid choices are: |
235 i386 | x86_64 | 249 i386 | x86_64 |
236 | 250 |
237 :type kernel_id: string | 251 :type kernel_id: string |
238 :param kernel_id: The ID of the kernel with which to launch the instance
s | 252 :param kernel_id: The ID of the kernel with which to launch |
| 253 the instances |
239 | 254 |
240 :type root_device_name: string | 255 :type root_device_name: string |
241 :param root_device_name: The root device name (e.g. /dev/sdh) | 256 :param root_device_name: The root device name (e.g. /dev/sdh) |
242 | 257 |
243 :type block_device_map: :class:`boto.ec2.blockdevicemapping.BlockDeviceM
apping` | 258 :type block_device_map: :class:`boto.ec2.blockdevicemapping.BlockDeviceM
apping` |
244 :param block_device_map: A BlockDeviceMapping data structure | 259 :param block_device_map: A BlockDeviceMapping data structure |
245 describing the EBS volumes associated | 260 describing the EBS volumes associated |
246 with the Image. | 261 with the Image. |
247 | 262 |
248 :rtype: string | 263 :rtype: string |
(...skipping 13 matching lines...) Expand all Loading... |
262 if image_location: | 277 if image_location: |
263 params['ImageLocation'] = image_location | 278 params['ImageLocation'] = image_location |
264 if root_device_name: | 279 if root_device_name: |
265 params['RootDeviceName'] = root_device_name | 280 params['RootDeviceName'] = root_device_name |
266 if block_device_map: | 281 if block_device_map: |
267 block_device_map.build_list_params(params) | 282 block_device_map.build_list_params(params) |
268 rs = self.get_object('RegisterImage', params, ResultSet, verb='POST') | 283 rs = self.get_object('RegisterImage', params, ResultSet, verb='POST') |
269 image_id = getattr(rs, 'imageId', None) | 284 image_id = getattr(rs, 'imageId', None) |
270 return image_id | 285 return image_id |
271 | 286 |
272 def deregister_image(self, image_id): | 287 def deregister_image(self, image_id, delete_snapshot=False): |
273 """ | 288 """ |
274 Unregister an AMI. | 289 Unregister an AMI. |
275 | 290 |
276 :type image_id: string | 291 :type image_id: string |
277 :param image_id: the ID of the Image to unregister | 292 :param image_id: the ID of the Image to unregister |
278 | 293 |
| 294 :type delete_snapshot: bool |
| 295 :param delete_snapshot: Set to True if we should delete the |
| 296 snapshot associated with an EBS volume |
| 297 mounted at /dev/sda1 |
| 298 |
279 :rtype: bool | 299 :rtype: bool |
280 :return: True if successful | 300 :return: True if successful |
281 """ | 301 """ |
282 return self.get_status('DeregisterImage', {'ImageId':image_id}, verb='PO
ST') | 302 snapshot_id = None |
| 303 if delete_snapshot: |
| 304 image = self.get_image(image_id) |
| 305 for key in image.block_device_mapping: |
| 306 if key == "/dev/sda1": |
| 307 snapshot_id = image.block_device_mapping[key].snapshot_id |
| 308 break |
283 | 309 |
284 def create_image(self, instance_id, name, description=None, no_reboot=False)
: | 310 result = self.get_status('DeregisterImage', |
| 311 {'ImageId':image_id}, verb='POST') |
| 312 if result and snapshot_id: |
| 313 return result and self.delete_snapshot(snapshot_id) |
| 314 return result |
| 315 |
| 316 def create_image(self, instance_id, name, |
| 317 description=None, no_reboot=False): |
285 """ | 318 """ |
286 Will create an AMI from the instance in the running or stopped | 319 Will create an AMI from the instance in the running or stopped |
287 state. | 320 state. |
288 | 321 |
289 :type instance_id: string | 322 :type instance_id: string |
290 :param instance_id: the ID of the instance to image. | 323 :param instance_id: the ID of the instance to image. |
291 | 324 |
292 :type name: string | 325 :type name: string |
293 :param name: The name of the new image | 326 :param name: The name of the new image |
294 | 327 |
295 :type description: string | 328 :type description: string |
296 :param description: An optional human-readable string describing | 329 :param description: An optional human-readable string describing |
297 the contents and purpose of the AMI. | 330 the contents and purpose of the AMI. |
298 | 331 |
299 :type no_reboot: bool | 332 :type no_reboot: bool |
300 :param no_reboot: An optional flag indicating that the bundling process | 333 :param no_reboot: An optional flag indicating that the bundling process |
301 should not attempt to shutdown the instance before | 334 should not attempt to shutdown the instance before |
302 bundling. If this flag is True, the responsibility | 335 bundling. If this flag is True, the responsibility |
303 of maintaining file system integrity is left to the | 336 of maintaining file system integrity is left to the |
304 owner of the instance. | 337 owner of the instance. |
305 | 338 |
306 :rtype: string | 339 :rtype: string |
307 :return: The new image id | 340 :return: The new image id |
308 """ | 341 """ |
309 params = {'InstanceId' : instance_id, | 342 params = {'InstanceId' : instance_id, |
310 'Name' : name} | 343 'Name' : name} |
311 if description: | 344 if description: |
312 params['Description'] = description | 345 params['Description'] = description |
313 if no_reboot: | 346 if no_reboot: |
314 params['NoReboot'] = 'true' | 347 params['NoReboot'] = 'true' |
315 img = self.get_object('CreateImage', params, Image, verb='POST') | 348 img = self.get_object('CreateImage', params, Image, verb='POST') |
316 return img.id | 349 return img.id |
317 | 350 |
318 # ImageAttribute methods | 351 # ImageAttribute methods |
319 | 352 |
320 def get_image_attribute(self, image_id, attribute='launchPermission'): | 353 def get_image_attribute(self, image_id, attribute='launchPermission'): |
321 """ | 354 """ |
322 Gets an attribute from an image. | 355 Gets an attribute from an image. |
323 | 356 |
324 :type image_id: string | 357 :type image_id: string |
325 :param image_id: The Amazon image id for which you want info about | 358 :param image_id: The Amazon image id for which you want info about |
326 | 359 |
327 :type attribute: string | 360 :type attribute: string |
328 :param attribute: The attribute you need information about. | 361 :param attribute: The attribute you need information about. |
329 Valid choices are: | 362 Valid choices are: |
330 * launchPermission | 363 * launchPermission |
331 * productCodes | 364 * productCodes |
332 * blockDeviceMapping | 365 * blockDeviceMapping |
333 | 366 |
334 :rtype: :class:`boto.ec2.image.ImageAttribute` | 367 :rtype: :class:`boto.ec2.image.ImageAttribute` |
335 :return: An ImageAttribute object representing the value of the | 368 :return: An ImageAttribute object representing the value of the |
336 attribute requested | 369 attribute requested |
337 """ | 370 """ |
338 params = {'ImageId' : image_id, | 371 params = {'ImageId' : image_id, |
339 'Attribute' : attribute} | 372 'Attribute' : attribute} |
340 return self.get_object('DescribeImageAttribute', params, ImageAttribute,
verb='POST') | 373 return self.get_object('DescribeImageAttribute', params, |
| 374 ImageAttribute, verb='POST') |
341 | 375 |
342 def modify_image_attribute(self, image_id, attribute='launchPermission', | 376 def modify_image_attribute(self, image_id, attribute='launchPermission', |
343 operation='add', user_ids=None, groups=None, | 377 operation='add', user_ids=None, groups=None, |
344 product_codes=None): | 378 product_codes=None): |
345 """ | 379 """ |
346 Changes an attribute of an image. | 380 Changes an attribute of an image. |
347 | 381 |
348 :type image_id: string | 382 :type image_id: string |
349 :param image_id: The image id you wish to change | 383 :param image_id: The image id you wish to change |
350 | 384 |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
413 being performed. Check the EC2 API guide | 447 being performed. Check the EC2 API guide |
414 for details. | 448 for details. |
415 | 449 |
416 :rtype: list | 450 :rtype: list |
417 :return: A list of :class:`boto.ec2.instance.Reservation` | 451 :return: A list of :class:`boto.ec2.instance.Reservation` |
418 """ | 452 """ |
419 params = {} | 453 params = {} |
420 if instance_ids: | 454 if instance_ids: |
421 self.build_list_params(params, instance_ids, 'InstanceId') | 455 self.build_list_params(params, instance_ids, 'InstanceId') |
422 if filters: | 456 if filters: |
| 457 if 'group-id' in filters: |
| 458 warnings.warn("The group-id filter now requires a security " |
| 459 "group identifier (sg-*) instead of a group " |
| 460 "name. To filter by group name use the " |
| 461 "'group-name' filter instead.", UserWarning) |
423 self.build_filter_params(params, filters) | 462 self.build_filter_params(params, filters) |
424 return self.get_list('DescribeInstances', params, | 463 return self.get_list('DescribeInstances', params, |
425 [('item', Reservation)], verb='POST') | 464 [('item', Reservation)], verb='POST') |
426 | 465 |
427 def run_instances(self, image_id, min_count=1, max_count=1, | 466 def run_instances(self, image_id, min_count=1, max_count=1, |
428 key_name=None, security_groups=None, | 467 key_name=None, security_groups=None, |
429 user_data=None, addressing_type=None, | 468 user_data=None, addressing_type=None, |
430 instance_type='m1.small', placement=None, | 469 instance_type='m1.small', placement=None, |
431 kernel_id=None, ramdisk_id=None, | 470 kernel_id=None, ramdisk_id=None, |
432 monitoring_enabled=False, subnet_id=None, | 471 monitoring_enabled=False, subnet_id=None, |
433 block_device_map=None, | 472 block_device_map=None, |
434 disable_api_termination=False, | 473 disable_api_termination=False, |
435 instance_initiated_shutdown_behavior=None, | 474 instance_initiated_shutdown_behavior=None, |
436 private_ip_address=None, | 475 private_ip_address=None, |
437 placement_group=None, client_token=None): | 476 placement_group=None, client_token=None, |
| 477 security_group_ids=None): |
438 """ | 478 """ |
439 Runs an image on EC2. | 479 Runs an image on EC2. |
440 | 480 |
441 :type image_id: string | 481 :type image_id: string |
442 :param image_id: The ID of the image to run | 482 :param image_id: The ID of the image to run |
443 | 483 |
444 :type min_count: int | 484 :type min_count: int |
445 :param min_count: The minimum number of instances to launch | 485 :param min_count: The minimum number of instances to launch |
446 | 486 |
447 :type max_count: int | 487 :type max_count: int |
448 :param max_count: The maximum number of instances to launch | 488 :param max_count: The maximum number of instances to launch |
449 | 489 |
450 :type key_name: string | 490 :type key_name: string |
451 :param key_name: The name of the key pair with which to launch instances | 491 :param key_name: The name of the key pair with which to launch instances |
452 | 492 |
453 :type security_groups: list of strings | 493 :type security_groups: list of strings |
454 :param security_groups: The names of the security groups with which to | 494 :param security_groups: The names of the security groups with which to |
455 associate instances | 495 associate instances |
456 | 496 |
457 :type user_data: string | 497 :type user_data: string |
458 :param user_data: The user data passed to the launched instances | 498 :param user_data: The user data passed to the launched instances |
459 | 499 |
460 :type instance_type: string | 500 :type instance_type: string |
461 :param instance_type: The type of instance to run: | 501 :param instance_type: The type of instance to run: |
462 | 502 |
463 * m1.small | 503 * m1.small |
464 * m1.large | 504 * m1.large |
465 * m1.xlarge | 505 * m1.xlarge |
466 * c1.medium | 506 * c1.medium |
467 * c1.xlarge | 507 * c1.xlarge |
468 * m2.xlarge | 508 * m2.xlarge |
469 * m2.2xlarge | 509 * m2.2xlarge |
470 * m2.4xlarge | 510 * m2.4xlarge |
471 * cc1.4xlarge | 511 * cc1.4xlarge |
472 * t1.micro | 512 * t1.micro |
(...skipping 27 matching lines...) Expand all Loading... |
500 describing the EBS volumes associated | 540 describing the EBS volumes associated |
501 with the Image. | 541 with the Image. |
502 | 542 |
503 :type disable_api_termination: bool | 543 :type disable_api_termination: bool |
504 :param disable_api_termination: If True, the instances will be locked | 544 :param disable_api_termination: If True, the instances will be locked |
505 and will not be able to be terminated | 545 and will not be able to be terminated |
506 via the API. | 546 via the API. |
507 | 547 |
508 :type instance_initiated_shutdown_behavior: string | 548 :type instance_initiated_shutdown_behavior: string |
509 :param instance_initiated_shutdown_behavior: Specifies whether the | 549 :param instance_initiated_shutdown_behavior: Specifies whether the |
510 instance's EBS volumes are | 550 instance stops or |
511 stopped (i.e. detached) or | 551 terminates on |
512 terminated (i.e. deleted) | 552 instance-initiated |
513 when the instance is | 553 shutdown. |
514 shutdown by the | 554 Valid values are: |
515 owner. Valid values are: | 555 |
516 | |
517 * stop | 556 * stop |
518 * terminate | 557 * terminate |
519 | 558 |
520 :type placement_group: string | 559 :type placement_group: string |
521 :param placement_group: If specified, this is the name of the placement | 560 :param placement_group: If specified, this is the name of the placement |
522 group in which the instance(s) will be launched. | 561 group in which the instance(s) will be launched. |
523 | 562 |
524 :type client_token: string | 563 :type client_token: string |
525 :param client_token: Unique, case-sensitive identifier you provide | 564 :param client_token: Unique, case-sensitive identifier you provide |
526 to ensure idempotency of the request. | 565 to ensure idempotency of the request. |
527 Maximum 64 ASCII characters | 566 Maximum 64 ASCII characters |
528 | 567 |
529 :rtype: Reservation | 568 :rtype: Reservation |
530 :return: The :class:`boto.ec2.instance.Reservation` associated with | 569 :return: The :class:`boto.ec2.instance.Reservation` associated with |
531 the request for machines | 570 the request for machines |
| 571 |
| 572 :type security_group_ids: list of strings |
| 573 :param security_group_ids: The ID of the VPC security groups with |
| 574 which to associate instances |
532 """ | 575 """ |
533 params = {'ImageId':image_id, | 576 params = {'ImageId':image_id, |
534 'MinCount':min_count, | 577 'MinCount':min_count, |
535 'MaxCount': max_count} | 578 'MaxCount': max_count} |
536 if key_name: | 579 if key_name: |
537 params['KeyName'] = key_name | 580 params['KeyName'] = key_name |
| 581 if security_group_ids: |
| 582 l = [] |
| 583 for group in security_group_ids: |
| 584 if isinstance(group, SecurityGroup): |
| 585 l.append(group.name) |
| 586 else: |
| 587 l.append(group) |
| 588 self.build_list_params(params, l, 'SecurityGroupId') |
538 if security_groups: | 589 if security_groups: |
539 l = [] | 590 l = [] |
540 for group in security_groups: | 591 for group in security_groups: |
541 if isinstance(group, SecurityGroup): | 592 if isinstance(group, SecurityGroup): |
542 l.append(group.name) | 593 l.append(group.name) |
543 else: | 594 else: |
544 l.append(group) | 595 l.append(group) |
545 self.build_list_params(params, l, 'SecurityGroup') | 596 self.build_list_params(params, l, 'SecurityGroup') |
546 if user_data: | 597 if user_data: |
547 params['UserData'] = base64.b64encode(user_data) | 598 params['UserData'] = base64.b64encode(user_data) |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
580 | 631 |
581 :type instance_ids: list | 632 :type instance_ids: list |
582 :param instance_ids: A list of strings of the Instance IDs to terminate | 633 :param instance_ids: A list of strings of the Instance IDs to terminate |
583 | 634 |
584 :rtype: list | 635 :rtype: list |
585 :return: A list of the instances terminated | 636 :return: A list of the instances terminated |
586 """ | 637 """ |
587 params = {} | 638 params = {} |
588 if instance_ids: | 639 if instance_ids: |
589 self.build_list_params(params, instance_ids, 'InstanceId') | 640 self.build_list_params(params, instance_ids, 'InstanceId') |
590 return self.get_list('TerminateInstances', params, [('item', Instance)],
verb='POST') | 641 return self.get_list('TerminateInstances', params, |
| 642 [('item', Instance)], verb='POST') |
591 | 643 |
592 def stop_instances(self, instance_ids=None, force=False): | 644 def stop_instances(self, instance_ids=None, force=False): |
593 """ | 645 """ |
594 Stop the instances specified | 646 Stop the instances specified |
595 | 647 |
596 :type instance_ids: list | 648 :type instance_ids: list |
597 :param instance_ids: A list of strings of the Instance IDs to stop | 649 :param instance_ids: A list of strings of the Instance IDs to stop |
598 | 650 |
599 :type force: bool | 651 :type force: bool |
600 :param force: Forces the instance to stop | 652 :param force: Forces the instance to stop |
601 | 653 |
602 :rtype: list | 654 :rtype: list |
603 :return: A list of the instances stopped | 655 :return: A list of the instances stopped |
604 """ | 656 """ |
605 params = {} | 657 params = {} |
606 if force: | 658 if force: |
607 params['Force'] = 'true' | 659 params['Force'] = 'true' |
608 if instance_ids: | 660 if instance_ids: |
609 self.build_list_params(params, instance_ids, 'InstanceId') | 661 self.build_list_params(params, instance_ids, 'InstanceId') |
610 return self.get_list('StopInstances', params, [('item', Instance)], verb
='POST') | 662 return self.get_list('StopInstances', params, |
| 663 [('item', Instance)], verb='POST') |
611 | 664 |
612 def start_instances(self, instance_ids=None): | 665 def start_instances(self, instance_ids=None): |
613 """ | 666 """ |
614 Start the instances specified | 667 Start the instances specified |
615 | 668 |
616 :type instance_ids: list | 669 :type instance_ids: list |
617 :param instance_ids: A list of strings of the Instance IDs to start | 670 :param instance_ids: A list of strings of the Instance IDs to start |
618 | 671 |
619 :rtype: list | 672 :rtype: list |
620 :return: A list of the instances started | 673 :return: A list of the instances started |
621 """ | 674 """ |
622 params = {} | 675 params = {} |
623 if instance_ids: | 676 if instance_ids: |
624 self.build_list_params(params, instance_ids, 'InstanceId') | 677 self.build_list_params(params, instance_ids, 'InstanceId') |
625 return self.get_list('StartInstances', params, [('item', Instance)], ver
b='POST') | 678 return self.get_list('StartInstances', params, |
| 679 [('item', Instance)], verb='POST') |
626 | 680 |
627 def get_console_output(self, instance_id): | 681 def get_console_output(self, instance_id): |
628 """ | 682 """ |
629 Retrieves the console output for the specified instance. | 683 Retrieves the console output for the specified instance. |
630 | 684 |
631 :type instance_id: string | 685 :type instance_id: string |
632 :param instance_id: The instance ID of a running instance on the cloud. | 686 :param instance_id: The instance ID of a running instance on the cloud. |
633 | 687 |
634 :rtype: :class:`boto.ec2.instance.ConsoleOutput` | 688 :rtype: :class:`boto.ec2.instance.ConsoleOutput` |
635 :return: The console output as a ConsoleOutput object | 689 :return: The console output as a ConsoleOutput object |
636 """ | 690 """ |
637 params = {} | 691 params = {} |
638 self.build_list_params(params, [instance_id], 'InstanceId') | 692 self.build_list_params(params, [instance_id], 'InstanceId') |
639 return self.get_object('GetConsoleOutput', params, ConsoleOutput, verb='
POST') | 693 return self.get_object('GetConsoleOutput', params, |
| 694 ConsoleOutput, verb='POST') |
640 | 695 |
641 def reboot_instances(self, instance_ids=None): | 696 def reboot_instances(self, instance_ids=None): |
642 """ | 697 """ |
643 Reboot the specified instances. | 698 Reboot the specified instances. |
644 | 699 |
645 :type instance_ids: list | 700 :type instance_ids: list |
646 :param instance_ids: The instances to terminate and reboot | 701 :param instance_ids: The instances to terminate and reboot |
647 """ | 702 """ |
648 params = {} | 703 params = {} |
649 if instance_ids: | 704 if instance_ids: |
650 self.build_list_params(params, instance_ids, 'InstanceId') | 705 self.build_list_params(params, instance_ids, 'InstanceId') |
651 return self.get_status('RebootInstances', params) | 706 return self.get_status('RebootInstances', params) |
652 | 707 |
653 def confirm_product_instance(self, product_code, instance_id): | 708 def confirm_product_instance(self, product_code, instance_id): |
654 params = {'ProductCode' : product_code, | 709 params = {'ProductCode' : product_code, |
655 'InstanceId' : instance_id} | 710 'InstanceId' : instance_id} |
656 rs = self.get_object('ConfirmProductInstance', params, ResultSet, verb='
POST') | 711 rs = self.get_object('ConfirmProductInstance', params, |
| 712 ResultSet, verb='POST') |
657 return (rs.status, rs.ownerId) | 713 return (rs.status, rs.ownerId) |
658 | 714 |
659 # InstanceAttribute methods | 715 # InstanceAttribute methods |
660 | 716 |
661 def get_instance_attribute(self, instance_id, attribute): | 717 def get_instance_attribute(self, instance_id, attribute): |
662 """ | 718 """ |
663 Gets an attribute from an instance. | 719 Gets an attribute from an instance. |
664 | 720 |
665 :type instance_id: string | 721 :type instance_id: string |
666 :param instance_id: The Amazon id of the instance | 722 :param instance_id: The Amazon id of the instance |
667 | 723 |
668 :type attribute: string | 724 :type attribute: string |
669 :param attribute: The attribute you need information about | 725 :param attribute: The attribute you need information about |
670 Valid choices are: | 726 Valid choices are: |
671 | 727 |
672 * instanceType|kernel|ramdisk|userData| | 728 * instanceType|kernel|ramdisk|userData| |
673 * disableApiTermination| | 729 * disableApiTermination| |
674 * instanceInitiatedShutdownBehavior| | 730 * instanceInitiatedShutdownBehavior| |
675 * rootDeviceName|blockDeviceMapping | 731 * rootDeviceName|blockDeviceMapping |
676 | 732 |
677 :rtype: :class:`boto.ec2.image.InstanceAttribute` | 733 :rtype: :class:`boto.ec2.image.InstanceAttribute` |
678 :return: An InstanceAttribute object representing the value of the | 734 :return: An InstanceAttribute object representing the value of the |
679 attribute requested | 735 attribute requested |
680 """ | 736 """ |
681 params = {'InstanceId' : instance_id} | 737 params = {'InstanceId' : instance_id} |
682 if attribute: | 738 if attribute: |
683 params['Attribute'] = attribute | 739 params['Attribute'] = attribute |
684 return self.get_object('DescribeInstanceAttribute', params, | 740 return self.get_object('DescribeInstanceAttribute', params, |
685 InstanceAttribute, verb='POST') | 741 InstanceAttribute, verb='POST') |
686 | 742 |
687 def modify_instance_attribute(self, instance_id, attribute, value): | 743 def modify_instance_attribute(self, instance_id, attribute, value): |
688 """ | 744 """ |
689 Changes an attribute of an instance | 745 Changes an attribute of an instance |
690 | 746 |
691 :type instance_id: string | 747 :type instance_id: string |
692 :param instance_id: The instance id you wish to change | 748 :param instance_id: The instance id you wish to change |
693 | 749 |
694 :type attribute: string | 750 :type attribute: string |
695 :param attribute: The attribute you wish to change. | 751 :param attribute: The attribute you wish to change. |
696 | 752 |
697 * AttributeName - Expected value (default) | 753 * AttributeName - Expected value (default) |
698 * instanceType - A valid instance type (m1.small) | 754 * instanceType - A valid instance type (m1.small) |
699 * kernel - Kernel ID (None) | 755 * kernel - Kernel ID (None) |
700 * ramdisk - Ramdisk ID (None) | 756 * ramdisk - Ramdisk ID (None) |
701 * userData - Base64 encoded String (None) | 757 * userData - Base64 encoded String (None) |
702 * disableApiTermination - Boolean (true) | 758 * disableApiTermination - Boolean (true) |
703 * instanceInitiatedShutdownBehavior - stop|terminate | 759 * instanceInitiatedShutdownBehavior - stop|terminate |
704 * rootDeviceName - device name (None) | 760 * rootDeviceName - device name (None) |
705 | 761 |
706 :type value: string | 762 :type value: string |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
738 params = {'InstanceId' : instance_id, | 794 params = {'InstanceId' : instance_id, |
739 'Attribute' : attribute} | 795 'Attribute' : attribute} |
740 return self.get_status('ResetInstanceAttribute', params, verb='POST') | 796 return self.get_status('ResetInstanceAttribute', params, verb='POST') |
741 | 797 |
742 # Spot Instances | 798 # Spot Instances |
743 | 799 |
744 def get_all_spot_instance_requests(self, request_ids=None, | 800 def get_all_spot_instance_requests(self, request_ids=None, |
745 filters=None): | 801 filters=None): |
746 """ | 802 """ |
747 Retrieve all the spot instances requests associated with your account. | 803 Retrieve all the spot instances requests associated with your account. |
748 | 804 |
749 :type request_ids: list | 805 :type request_ids: list |
750 :param request_ids: A list of strings of spot instance request IDs | 806 :param request_ids: A list of strings of spot instance request IDs |
751 | 807 |
752 :type filters: dict | 808 :type filters: dict |
753 :param filters: Optional filters that can be used to limit | 809 :param filters: Optional filters that can be used to limit |
754 the results returned. Filters are provided | 810 the results returned. Filters are provided |
755 in the form of a dictionary consisting of | 811 in the form of a dictionary consisting of |
756 filter names as the key and filter values | 812 filter names as the key and filter values |
757 as the value. The set of allowable filter | 813 as the value. The set of allowable filter |
758 names/values is dependent on the request | 814 names/values is dependent on the request |
759 being performed. Check the EC2 API guide | 815 being performed. Check the EC2 API guide |
760 for details. | 816 for details. |
761 | 817 |
762 :rtype: list | 818 :rtype: list |
763 :return: A list of | 819 :return: A list of |
764 :class:`boto.ec2.spotinstancerequest.SpotInstanceRequest` | 820 :class:`boto.ec2.spotinstancerequest.SpotInstanceRequest` |
765 """ | 821 """ |
766 params = {} | 822 params = {} |
767 if request_ids: | 823 if request_ids: |
768 self.build_list_params(params, request_ids, 'SpotInstanceRequestId') | 824 self.build_list_params(params, request_ids, 'SpotInstanceRequestId') |
769 if filters: | 825 if filters: |
| 826 if 'launch.group-id' in filters: |
| 827 warnings.warn("The 'launch.group-id' filter now requires a " |
| 828 "security group id (sg-*) and no longer supports " |
| 829 "filtering by group name. Please update your " |
| 830 "filters accordingly.", UserWarning) |
770 self.build_filter_params(params, filters) | 831 self.build_filter_params(params, filters) |
771 return self.get_list('DescribeSpotInstanceRequests', params, | 832 return self.get_list('DescribeSpotInstanceRequests', params, |
772 [('item', SpotInstanceRequest)], verb='POST') | 833 [('item', SpotInstanceRequest)], verb='POST') |
773 | 834 |
774 def get_spot_price_history(self, start_time=None, end_time=None, | 835 def get_spot_price_history(self, start_time=None, end_time=None, |
775 instance_type=None, product_description=None): | 836 instance_type=None, product_description=None, |
| 837 availability_zone=None): |
776 """ | 838 """ |
777 Retrieve the recent history of spot instances pricing. | 839 Retrieve the recent history of spot instances pricing. |
778 | 840 |
779 :type start_time: str | 841 :type start_time: str |
780 :param start_time: An indication of how far back to provide price | 842 :param start_time: An indication of how far back to provide price |
781 changes for. An ISO8601 DateTime string. | 843 changes for. An ISO8601 DateTime string. |
782 | 844 |
783 :type end_time: str | 845 :type end_time: str |
784 :param end_time: An indication of how far forward to provide price | 846 :param end_time: An indication of how far forward to provide price |
785 changes for. An ISO8601 DateTime string. | 847 changes for. An ISO8601 DateTime string. |
786 | 848 |
787 :type instance_type: str | 849 :type instance_type: str |
788 :param instance_type: Filter responses to a particular instance type. | 850 :param instance_type: Filter responses to a particular instance type. |
789 | 851 |
790 :type product_description: str | 852 :type product_description: str |
791 :param product_descripton: Filter responses to a particular platform. | 853 :param product_description: Filter responses to a particular platform. |
792 Valid values are currently: Linux | 854 Valid values are currently: "Linux/UNIX", |
793 | 855 "SUSE Linux", and "Windows" |
| 856 |
| 857 :type availability_zone: str |
| 858 :param availability_zone: The availability zone for which prices |
| 859 should be returned |
| 860 |
794 :rtype: list | 861 :rtype: list |
795 :return: A list tuples containing price and timestamp. | 862 :return: A list tuples containing price and timestamp. |
796 """ | 863 """ |
797 params = {} | 864 params = {} |
798 if start_time: | 865 if start_time: |
799 params['StartTime'] = start_time | 866 params['StartTime'] = start_time |
800 if end_time: | 867 if end_time: |
801 params['EndTime'] = end_time | 868 params['EndTime'] = end_time |
802 if instance_type: | 869 if instance_type: |
803 params['InstanceType'] = instance_type | 870 params['InstanceType'] = instance_type |
804 if product_description: | 871 if product_description: |
805 params['ProductDescription'] = product_description | 872 params['ProductDescription'] = product_description |
| 873 if availability_zone: |
| 874 params['AvailabilityZone'] = availability_zone |
806 return self.get_list('DescribeSpotPriceHistory', params, | 875 return self.get_list('DescribeSpotPriceHistory', params, |
807 [('item', SpotPriceHistory)], verb='POST') | 876 [('item', SpotPriceHistory)], verb='POST') |
808 | 877 |
809 def request_spot_instances(self, price, image_id, count=1, type='one-time', | 878 def request_spot_instances(self, price, image_id, count=1, type='one-time', |
810 valid_from=None, valid_until=None, | 879 valid_from=None, valid_until=None, |
811 launch_group=None, availability_zone_group=None, | 880 launch_group=None, availability_zone_group=None, |
812 key_name=None, security_groups=None, | 881 key_name=None, security_groups=None, |
813 user_data=None, addressing_type=None, | 882 user_data=None, addressing_type=None, |
814 instance_type='m1.small', placement=None, | 883 instance_type='m1.small', placement=None, |
815 kernel_id=None, ramdisk_id=None, | 884 kernel_id=None, ramdisk_id=None, |
816 monitoring_enabled=False, subnet_id=None, | 885 monitoring_enabled=False, subnet_id=None, |
817 block_device_map=None): | 886 block_device_map=None): |
818 """ | 887 """ |
819 Request instances on the spot market at a particular price. | 888 Request instances on the spot market at a particular price. |
820 | 889 |
821 :type price: str | 890 :type price: str |
822 :param price: The maximum price of your bid | 891 :param price: The maximum price of your bid |
823 | 892 |
824 :type image_id: string | 893 :type image_id: string |
825 :param image_id: The ID of the image to run | 894 :param image_id: The ID of the image to run |
826 | 895 |
827 :type count: int | 896 :type count: int |
828 :param count: The of instances to requested | 897 :param count: The of instances to requested |
829 | 898 |
830 :type type: str | 899 :type type: str |
831 :param type: Type of request. Can be 'one-time' or 'persistent'. | 900 :param type: Type of request. Can be 'one-time' or 'persistent'. |
832 Default is one-time. | 901 Default is one-time. |
833 | 902 |
834 :type valid_from: str | 903 :type valid_from: str |
835 :param valid_from: Start date of the request. An ISO8601 time string. | 904 :param valid_from: Start date of the request. An ISO8601 time string. |
836 | 905 |
837 :type valid_until: str | 906 :type valid_until: str |
838 :param valid_until: End date of the request. An ISO8601 time string. | 907 :param valid_until: End date of the request. An ISO8601 time string. |
839 | 908 |
840 :type launch_group: str | 909 :type launch_group: str |
841 :param launch_group: If supplied, all requests will be fulfilled | 910 :param launch_group: If supplied, all requests will be fulfilled |
842 as a group. | 911 as a group. |
843 | 912 |
844 :type availability_zone_group: str | 913 :type availability_zone_group: str |
845 :param availability_zone_group: If supplied, all requests will be | 914 :param availability_zone_group: If supplied, all requests will be |
846 fulfilled within a single | 915 fulfilled within a single |
847 availability zone. | 916 availability zone. |
848 | 917 |
849 :type key_name: string | 918 :type key_name: string |
850 :param key_name: The name of the key pair with which to launch instances | 919 :param key_name: The name of the key pair with which to launch instances |
851 | 920 |
852 :type security_groups: list of strings | 921 :type security_groups: list of strings |
853 :param security_groups: The names of the security groups with which to | 922 :param security_groups: The names of the security groups with which to |
854 associate instances | 923 associate instances |
855 | 924 |
856 :type user_data: string | 925 :type user_data: string |
857 :param user_data: The user data passed to the launched instances | 926 :param user_data: The user data passed to the launched instances |
858 | 927 |
859 :type instance_type: string | 928 :type instance_type: string |
860 :param instance_type: The type of instance to run: | 929 :param instance_type: The type of instance to run: |
861 | 930 |
862 * m1.small | 931 * m1.small |
863 * m1.large | 932 * m1.large |
864 * m1.xlarge | 933 * m1.xlarge |
865 * c1.medium | 934 * c1.medium |
866 * c1.xlarge | 935 * c1.xlarge |
867 * m2.xlarge | 936 * m2.xlarge |
868 * m2.2xlarge | 937 * m2.2xlarge |
869 * m2.4xlarge | 938 * m2.4xlarge |
870 * cc1.4xlarge | 939 * cc1.4xlarge |
871 * t1.micro | 940 * t1.micro |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
936 if monitoring_enabled: | 1005 if monitoring_enabled: |
937 params['LaunchSpecification.Monitoring.Enabled'] = 'true' | 1006 params['LaunchSpecification.Monitoring.Enabled'] = 'true' |
938 if subnet_id: | 1007 if subnet_id: |
939 params['LaunchSpecification.SubnetId'] = subnet_id | 1008 params['LaunchSpecification.SubnetId'] = subnet_id |
940 if block_device_map: | 1009 if block_device_map: |
941 block_device_map.build_list_params(params, 'LaunchSpecification.') | 1010 block_device_map.build_list_params(params, 'LaunchSpecification.') |
942 return self.get_list('RequestSpotInstances', params, | 1011 return self.get_list('RequestSpotInstances', params, |
943 [('item', SpotInstanceRequest)], | 1012 [('item', SpotInstanceRequest)], |
944 verb='POST') | 1013 verb='POST') |
945 | 1014 |
946 | 1015 |
947 def cancel_spot_instance_requests(self, request_ids): | 1016 def cancel_spot_instance_requests(self, request_ids): |
948 """ | 1017 """ |
949 Cancel the specified Spot Instance Requests. | 1018 Cancel the specified Spot Instance Requests. |
950 | 1019 |
951 :type request_ids: list | 1020 :type request_ids: list |
952 :param request_ids: A list of strings of the Request IDs to terminate | 1021 :param request_ids: A list of strings of the Request IDs to terminate |
953 | 1022 |
954 :rtype: list | 1023 :rtype: list |
955 :return: A list of the instances terminated | 1024 :return: A list of the instances terminated |
956 """ | 1025 """ |
957 params = {} | 1026 params = {} |
958 if request_ids: | 1027 if request_ids: |
959 self.build_list_params(params, request_ids, 'SpotInstanceRequestId') | 1028 self.build_list_params(params, request_ids, 'SpotInstanceRequestId') |
960 return self.get_list('CancelSpotInstanceRequests', params, | 1029 return self.get_list('CancelSpotInstanceRequests', params, |
961 [('item', Instance)], verb='POST') | 1030 [('item', Instance)], verb='POST') |
962 | 1031 |
963 def get_spot_datafeed_subscription(self): | 1032 def get_spot_datafeed_subscription(self): |
964 """ | 1033 """ |
965 Return the current spot instance data feed subscription | 1034 Return the current spot instance data feed subscription |
966 associated with this account, if any. | 1035 associated with this account, if any. |
967 | 1036 |
968 :rtype: :class:`boto.ec2.spotdatafeedsubscription.SpotDatafeedSubscripti
on` | 1037 :rtype: :class:`boto.ec2.spotdatafeedsubscription.SpotDatafeedSubscripti
on` |
969 :return: The datafeed subscription object or None | 1038 :return: The datafeed subscription object or None |
970 """ | 1039 """ |
971 return self.get_object('DescribeSpotDatafeedSubscription', | 1040 return self.get_object('DescribeSpotDatafeedSubscription', |
972 None, SpotDatafeedSubscription, verb='POST') | 1041 None, SpotDatafeedSubscription, verb='POST') |
973 | 1042 |
974 def create_spot_datafeed_subscription(self, bucket, prefix): | 1043 def create_spot_datafeed_subscription(self, bucket, prefix): |
975 """ | 1044 """ |
976 Create a spot instance datafeed subscription for this account. | 1045 Create a spot instance datafeed subscription for this account. |
977 | 1046 |
978 :type bucket: str or unicode | 1047 :type bucket: str or unicode |
979 :param bucket: The name of the bucket where spot instance data | 1048 :param bucket: The name of the bucket where spot instance data |
980 will be written. The account issuing this request | 1049 will be written. The account issuing this request |
981 must have FULL_CONTROL access to the bucket | 1050 must have FULL_CONTROL access to the bucket |
982 specified in the request. | 1051 specified in the request. |
983 | 1052 |
984 :type prefix: str or unicode | 1053 :type prefix: str or unicode |
985 :param prefix: An optional prefix that will be pre-pended to all | 1054 :param prefix: An optional prefix that will be pre-pended to all |
986 data files written to the bucket. | 1055 data files written to the bucket. |
987 | 1056 |
988 :rtype: :class:`boto.ec2.spotdatafeedsubscription.SpotDatafeedSubscripti
on` | 1057 :rtype: :class:`boto.ec2.spotdatafeedsubscription.SpotDatafeedSubscripti
on` |
989 :return: The datafeed subscription object or None | 1058 :return: The datafeed subscription object or None |
990 """ | 1059 """ |
991 params = {'Bucket' : bucket} | 1060 params = {'Bucket' : bucket} |
992 if prefix: | 1061 if prefix: |
993 params['Prefix'] = prefix | 1062 params['Prefix'] = prefix |
994 return self.get_object('CreateSpotDatafeedSubscription', | 1063 return self.get_object('CreateSpotDatafeedSubscription', |
995 params, SpotDatafeedSubscription, verb='POST') | 1064 params, SpotDatafeedSubscription, verb='POST') |
996 | 1065 |
997 def delete_spot_datafeed_subscription(self): | 1066 def delete_spot_datafeed_subscription(self): |
998 """ | 1067 """ |
999 Delete the current spot instance data feed subscription | 1068 Delete the current spot instance data feed subscription |
1000 associated with this account | 1069 associated with this account |
1001 | 1070 |
1002 :rtype: bool | 1071 :rtype: bool |
1003 :return: True if successful | 1072 :return: True if successful |
1004 """ | 1073 """ |
1005 return self.get_status('DeleteSpotDatafeedSubscription', None, verb='POS
T') | 1074 return self.get_status('DeleteSpotDatafeedSubscription', |
| 1075 None, verb='POST') |
1006 | 1076 |
1007 # Zone methods | 1077 # Zone methods |
1008 | 1078 |
1009 def get_all_zones(self, zones=None, filters=None): | 1079 def get_all_zones(self, zones=None, filters=None): |
1010 """ | 1080 """ |
1011 Get all Availability Zones associated with the current region. | 1081 Get all Availability Zones associated with the current region. |
1012 | 1082 |
1013 :type zones: list | 1083 :type zones: list |
1014 :param zones: Optional list of zones. If this list is present, | 1084 :param zones: Optional list of zones. If this list is present, |
1015 only the Zones associated with these zone names | 1085 only the Zones associated with these zone names |
(...skipping 10 matching lines...) Expand all Loading... |
1026 for details. | 1096 for details. |
1027 | 1097 |
1028 :rtype: list of :class:`boto.ec2.zone.Zone` | 1098 :rtype: list of :class:`boto.ec2.zone.Zone` |
1029 :return: The requested Zone objects | 1099 :return: The requested Zone objects |
1030 """ | 1100 """ |
1031 params = {} | 1101 params = {} |
1032 if zones: | 1102 if zones: |
1033 self.build_list_params(params, zones, 'ZoneName') | 1103 self.build_list_params(params, zones, 'ZoneName') |
1034 if filters: | 1104 if filters: |
1035 self.build_filter_params(params, filters) | 1105 self.build_filter_params(params, filters) |
1036 return self.get_list('DescribeAvailabilityZones', params, [('item', Zone
)], verb='POST') | 1106 return self.get_list('DescribeAvailabilityZones', params, |
| 1107 [('item', Zone)], verb='POST') |
1037 | 1108 |
1038 # Address methods | 1109 # Address methods |
1039 | 1110 |
1040 def get_all_addresses(self, addresses=None, filters=None): | 1111 def get_all_addresses(self, addresses=None, filters=None, allocation_ids=Non
e): |
1041 """ | 1112 """ |
1042 Get all EIP's associated with the current credentials. | 1113 Get all EIP's associated with the current credentials. |
1043 | 1114 |
1044 :type addresses: list | 1115 :type addresses: list |
1045 :param addresses: Optional list of addresses. If this list is present, | 1116 :param addresses: Optional list of addresses. If this list is present, |
1046 only the Addresses associated with these addresses | 1117 only the Addresses associated with these addresses |
1047 will be returned. | 1118 will be returned. |
1048 | 1119 |
1049 :type filters: dict | 1120 :type filters: dict |
1050 :param filters: Optional filters that can be used to limit | 1121 :param filters: Optional filters that can be used to limit |
1051 the results returned. Filters are provided | 1122 the results returned. Filters are provided |
1052 in the form of a dictionary consisting of | 1123 in the form of a dictionary consisting of |
1053 filter names as the key and filter values | 1124 filter names as the key and filter values |
1054 as the value. The set of allowable filter | 1125 as the value. The set of allowable filter |
1055 names/values is dependent on the request | 1126 names/values is dependent on the request |
1056 being performed. Check the EC2 API guide | 1127 being performed. Check the EC2 API guide |
1057 for details. | 1128 for details. |
1058 | 1129 |
| 1130 :type allocation_ids: list |
| 1131 :param allocation_ids: Optional list of allocation IDs. If this list is |
| 1132 present, only the Addresses associated with the given |
| 1133 allocation IDs will be returned. |
| 1134 |
1059 :rtype: list of :class:`boto.ec2.address.Address` | 1135 :rtype: list of :class:`boto.ec2.address.Address` |
1060 :return: The requested Address objects | 1136 :return: The requested Address objects |
1061 """ | 1137 """ |
1062 params = {} | 1138 params = {} |
1063 if addresses: | 1139 if addresses: |
1064 self.build_list_params(params, addresses, 'PublicIp') | 1140 self.build_list_params(params, addresses, 'PublicIp') |
| 1141 if allocation_ids: |
| 1142 self.build_list_params(params, allocation_ids, 'AllocationId') |
1065 if filters: | 1143 if filters: |
1066 self.build_filter_params(params, filters) | 1144 self.build_filter_params(params, filters) |
1067 return self.get_list('DescribeAddresses', params, [('item', Address)], v
erb='POST') | 1145 return self.get_list('DescribeAddresses', params, [('item', Address)], v
erb='POST') |
1068 | 1146 |
1069 def allocate_address(self): | 1147 def allocate_address(self, domain=None): |
1070 """ | 1148 """ |
1071 Allocate a new Elastic IP address and associate it with your account. | 1149 Allocate a new Elastic IP address and associate it with your account. |
1072 | 1150 |
1073 :rtype: :class:`boto.ec2.address.Address` | 1151 :rtype: :class:`boto.ec2.address.Address` |
1074 :return: The newly allocated Address | 1152 :return: The newly allocated Address |
1075 """ | 1153 """ |
1076 return self.get_object('AllocateAddress', {}, Address, verb='POST') | 1154 params = {} |
1077 | 1155 |
1078 def associate_address(self, instance_id, public_ip): | 1156 if domain is not None: |
| 1157 params['Domain'] = domain |
| 1158 |
| 1159 return self.get_object('AllocateAddress', params, Address, verb='POST') |
| 1160 |
| 1161 def associate_address(self, instance_id, public_ip=None, allocation_id=None)
: |
1079 """ | 1162 """ |
1080 Associate an Elastic IP address with a currently running instance. | 1163 Associate an Elastic IP address with a currently running instance. |
| 1164 This requires one of ``public_ip`` or ``allocation_id`` depending |
| 1165 on if you're associating a VPC address or a plain EC2 address. |
1081 | 1166 |
1082 :type instance_id: string | 1167 :type instance_id: string |
1083 :param instance_id: The ID of the instance | 1168 :param instance_id: The ID of the instance |
1084 | 1169 |
1085 :type public_ip: string | 1170 :type public_ip: string |
1086 :param public_ip: The public IP address | 1171 :param public_ip: The public IP address for EC2 based allocations. |
| 1172 |
| 1173 :type allocation_id: string |
| 1174 :param allocation_id: The allocation ID for a VPC-based elastic IP. |
1087 | 1175 |
1088 :rtype: bool | 1176 :rtype: bool |
1089 :return: True if successful | 1177 :return: True if successful |
1090 """ | 1178 """ |
1091 params = {'InstanceId' : instance_id, 'PublicIp' : public_ip} | 1179 params = { 'InstanceId' : instance_id } |
| 1180 |
| 1181 if public_ip is not None: |
| 1182 params['PublicIp'] = public_ip |
| 1183 elif allocation_id is not None: |
| 1184 params['AllocationId'] = allocation_id |
| 1185 |
1092 return self.get_status('AssociateAddress', params, verb='POST') | 1186 return self.get_status('AssociateAddress', params, verb='POST') |
1093 | 1187 |
1094 def disassociate_address(self, public_ip): | 1188 def disassociate_address(self, public_ip=None, association_id=None): |
1095 """ | 1189 """ |
1096 Disassociate an Elastic IP address from a currently running instance. | 1190 Disassociate an Elastic IP address from a currently running instance. |
1097 | 1191 |
1098 :type public_ip: string | 1192 :type public_ip: string |
1099 :param public_ip: The public IP address | 1193 :param public_ip: The public IP address for EC2 elastic IPs. |
| 1194 |
| 1195 :type association_id: string |
| 1196 :param association_id: The association ID for a VPC based elastic ip. |
1100 | 1197 |
1101 :rtype: bool | 1198 :rtype: bool |
1102 :return: True if successful | 1199 :return: True if successful |
1103 """ | 1200 """ |
1104 params = {'PublicIp' : public_ip} | 1201 params = {} |
| 1202 |
| 1203 if public_ip is not None: |
| 1204 params['PublicIp'] = public_ip |
| 1205 elif association_id is not None: |
| 1206 params['AssociationId'] = association_id |
| 1207 |
1105 return self.get_status('DisassociateAddress', params, verb='POST') | 1208 return self.get_status('DisassociateAddress', params, verb='POST') |
1106 | 1209 |
1107 def release_address(self, public_ip): | 1210 def release_address(self, public_ip=None, allocation_id=None): |
1108 """ | 1211 """ |
1109 Free up an Elastic IP address | 1212 Free up an Elastic IP address. |
1110 | 1213 |
1111 :type public_ip: string | 1214 :type public_ip: string |
1112 :param public_ip: The public IP address | 1215 :param public_ip: The public IP address for EC2 elastic IPs. |
| 1216 |
| 1217 :type allocation_id: string |
| 1218 :param allocation_id: The ID for VPC elastic IPs. |
1113 | 1219 |
1114 :rtype: bool | 1220 :rtype: bool |
1115 :return: True if successful | 1221 :return: True if successful |
1116 """ | 1222 """ |
1117 params = {'PublicIp' : public_ip} | 1223 params = {} |
| 1224 |
| 1225 if public_ip is not None: |
| 1226 params['PublicIp'] = public_ip |
| 1227 elif allocation_id is not None: |
| 1228 params['AllocationId'] = allocation_id |
| 1229 |
1118 return self.get_status('ReleaseAddress', params, verb='POST') | 1230 return self.get_status('ReleaseAddress', params, verb='POST') |
1119 | 1231 |
1120 # Volume methods | 1232 # Volume methods |
1121 | 1233 |
1122 def get_all_volumes(self, volume_ids=None, filters=None): | 1234 def get_all_volumes(self, volume_ids=None, filters=None): |
1123 """ | 1235 """ |
1124 Get all Volumes associated with the current credentials. | 1236 Get all Volumes associated with the current credentials. |
1125 | 1237 |
1126 :type volume_ids: list | 1238 :type volume_ids: list |
1127 :param volume_ids: Optional list of volume ids. If this list is present
, | 1239 :param volume_ids: Optional list of volume ids. If this list |
1128 only the volumes associated with these volume ids | 1240 is present, only the volumes associated with |
1129 will be returned. | 1241 these volume ids will be returned. |
1130 | 1242 |
1131 :type filters: dict | 1243 :type filters: dict |
1132 :param filters: Optional filters that can be used to limit | 1244 :param filters: Optional filters that can be used to limit |
1133 the results returned. Filters are provided | 1245 the results returned. Filters are provided |
1134 in the form of a dictionary consisting of | 1246 in the form of a dictionary consisting of |
1135 filter names as the key and filter values | 1247 filter names as the key and filter values |
1136 as the value. The set of allowable filter | 1248 as the value. The set of allowable filter |
1137 names/values is dependent on the request | 1249 names/values is dependent on the request |
1138 being performed. Check the EC2 API guide | 1250 being performed. Check the EC2 API guide |
1139 for details. | 1251 for details. |
1140 | 1252 |
1141 :rtype: list of :class:`boto.ec2.volume.Volume` | 1253 :rtype: list of :class:`boto.ec2.volume.Volume` |
1142 :return: The requested Volume objects | 1254 :return: The requested Volume objects |
1143 """ | 1255 """ |
1144 params = {} | 1256 params = {} |
1145 if volume_ids: | 1257 if volume_ids: |
1146 self.build_list_params(params, volume_ids, 'VolumeId') | 1258 self.build_list_params(params, volume_ids, 'VolumeId') |
1147 if filters: | 1259 if filters: |
1148 self.build_filter_params(params, filters) | 1260 self.build_filter_params(params, filters) |
1149 return self.get_list('DescribeVolumes', params, [('item', Volume)], verb
='POST') | 1261 return self.get_list('DescribeVolumes', params, |
| 1262 [('item', Volume)], verb='POST') |
1150 | 1263 |
1151 def create_volume(self, size, zone, snapshot=None): | 1264 def create_volume(self, size, zone, snapshot=None): |
1152 """ | 1265 """ |
1153 Create a new EBS Volume. | 1266 Create a new EBS Volume. |
1154 | 1267 |
1155 :type size: int | 1268 :type size: int |
1156 :param size: The size of the new volume, in GiB | 1269 :param size: The size of the new volume, in GiB |
1157 | 1270 |
1158 :type zone: string or :class:`boto.ec2.zone.Zone` | 1271 :type zone: string or :class:`boto.ec2.zone.Zone` |
1159 :param zone: The availability zone in which the Volume will be created. | 1272 :param zone: The availability zone in which the Volume will be created. |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1254 Get all EBS Snapshots associated with the current credentials. | 1367 Get all EBS Snapshots associated with the current credentials. |
1255 | 1368 |
1256 :type snapshot_ids: list | 1369 :type snapshot_ids: list |
1257 :param snapshot_ids: Optional list of snapshot ids. If this list is | 1370 :param snapshot_ids: Optional list of snapshot ids. If this list is |
1258 present, only the Snapshots associated with | 1371 present, only the Snapshots associated with |
1259 these snapshot ids will be returned. | 1372 these snapshot ids will be returned. |
1260 | 1373 |
1261 :type owner: str | 1374 :type owner: str |
1262 :param owner: If present, only the snapshots owned by the specified user | 1375 :param owner: If present, only the snapshots owned by the specified user |
1263 will be returned. Valid values are: | 1376 will be returned. Valid values are: |
1264 | 1377 |
1265 * self | 1378 * self |
1266 * amazon | 1379 * amazon |
1267 * AWS Account ID | 1380 * AWS Account ID |
1268 | 1381 |
1269 :type restorable_by: str | 1382 :type restorable_by: str |
1270 :param restorable_by: If present, only the snapshots that are restorable | 1383 :param restorable_by: If present, only the snapshots that are restorable |
1271 by the specified account id will be returned. | 1384 by the specified account id will be returned. |
1272 | 1385 |
1273 :type filters: dict | 1386 :type filters: dict |
1274 :param filters: Optional filters that can be used to limit | 1387 :param filters: Optional filters that can be used to limit |
(...skipping 10 matching lines...) Expand all Loading... |
1285 """ | 1398 """ |
1286 params = {} | 1399 params = {} |
1287 if snapshot_ids: | 1400 if snapshot_ids: |
1288 self.build_list_params(params, snapshot_ids, 'SnapshotId') | 1401 self.build_list_params(params, snapshot_ids, 'SnapshotId') |
1289 if owner: | 1402 if owner: |
1290 params['Owner'] = owner | 1403 params['Owner'] = owner |
1291 if restorable_by: | 1404 if restorable_by: |
1292 params['RestorableBy'] = restorable_by | 1405 params['RestorableBy'] = restorable_by |
1293 if filters: | 1406 if filters: |
1294 self.build_filter_params(params, filters) | 1407 self.build_filter_params(params, filters) |
1295 return self.get_list('DescribeSnapshots', params, [('item', Snapshot)],
verb='POST') | 1408 return self.get_list('DescribeSnapshots', params, |
| 1409 [('item', Snapshot)], verb='POST') |
1296 | 1410 |
1297 def create_snapshot(self, volume_id, description=None): | 1411 def create_snapshot(self, volume_id, description=None): |
1298 """ | 1412 """ |
1299 Create a snapshot of an existing EBS Volume. | 1413 Create a snapshot of an existing EBS Volume. |
1300 | 1414 |
1301 :type volume_id: str | 1415 :type volume_id: str |
1302 :param volume_id: The ID of the volume to be snapshot'ed | 1416 :param volume_id: The ID of the volume to be snapshot'ed |
1303 | 1417 |
1304 :type description: str | 1418 :type description: str |
1305 :param description: A description of the snapshot. | 1419 :param description: A description of the snapshot. |
1306 Limited to 255 characters. | 1420 Limited to 255 characters. |
1307 | 1421 |
1308 :rtype: bool | 1422 :rtype: bool |
1309 :return: True if successful | 1423 :return: True if successful |
1310 """ | 1424 """ |
1311 params = {'VolumeId' : volume_id} | 1425 params = {'VolumeId' : volume_id} |
1312 if description: | 1426 if description: |
1313 params['Description'] = description[0:255] | 1427 params['Description'] = description[0:255] |
1314 snapshot = self.get_object('CreateSnapshot', params, Snapshot, verb='POS
T') | 1428 snapshot = self.get_object('CreateSnapshot', params, |
| 1429 Snapshot, verb='POST') |
1315 volume = self.get_all_volumes([volume_id])[0] | 1430 volume = self.get_all_volumes([volume_id])[0] |
1316 volume_name = volume.tags.get('Name') | 1431 volume_name = volume.tags.get('Name') |
1317 if volume_name: | 1432 if volume_name: |
1318 snapshot.add_tag('Name', volume_name) | 1433 snapshot.add_tag('Name', volume_name) |
1319 return snapshot | 1434 return snapshot |
1320 | 1435 |
1321 def delete_snapshot(self, snapshot_id): | 1436 def delete_snapshot(self, snapshot_id): |
1322 params = {'SnapshotId': snapshot_id} | 1437 params = {'SnapshotId': snapshot_id} |
1323 return self.get_status('DeleteSnapshot', params, verb='POST') | 1438 return self.get_status('DeleteSnapshot', params, verb='POST') |
1324 | 1439 |
1325 def trim_snapshots(self, hourly_backups = 8, daily_backups = 7, weekly_backu
ps = 4): | 1440 def trim_snapshots(self, hourly_backups = 8, daily_backups = 7, |
| 1441 weekly_backups = 4): |
1326 """ | 1442 """ |
1327 Trim excess snapshots, based on when they were taken. More current snaps
hots are | 1443 Trim excess snapshots, based on when they were taken. More current |
1328 retained, with the number retained decreasing as you move back in time. | 1444 snapshots are retained, with the number retained decreasing as you |
| 1445 move back in time. |
1329 | 1446 |
1330 If ebs volumes have a 'Name' tag with a value, their snapshots will be a
ssigned the same | 1447 If ebs volumes have a 'Name' tag with a value, their snapshots |
1331 tag when they are created. The values of the 'Name' tags for snapshots a
re used by this | 1448 will be assigned the same tag when they are created. The values |
1332 function to group snapshots taken from the same volume (or from a series
of like-named | 1449 of the 'Name' tags for snapshots are used by this function to |
1333 volumes over time) for trimming. | 1450 group snapshots taken from the same volume (or from a series |
| 1451 of like-named volumes over time) for trimming. |
1334 | 1452 |
1335 For every group of like-named snapshots, this function retains the newes
t and oldest | 1453 For every group of like-named snapshots, this function retains |
1336 snapshots, as well as, by default, the first snapshots taken in each of
the last eight | 1454 the newest and oldest snapshots, as well as, by default, the |
1337 hours, the first snapshots taken in each of the last seven days, the fir
st snapshots | 1455 first snapshots taken in each of the last eight hours, the first |
1338 taken in the last 4 weeks (counting Midnight Sunday morning as the start
of the week), | 1456 snapshots taken in each of the last seven days, the first snapshots |
1339 and the first snapshot from the first Sunday of each month forever. | 1457 taken in the last 4 weeks (counting Midnight Sunday morning as |
| 1458 the start of the week), and the first snapshot from the first |
| 1459 Sunday of each month forever. |
1340 | 1460 |
1341 :type hourly_backups: int | 1461 :type hourly_backups: int |
1342 :param hourly_backups: How many recent hourly backups should be saved. | 1462 :param hourly_backups: How many recent hourly backups should be saved. |
1343 | 1463 |
1344 :type daily_backups: int | 1464 :type daily_backups: int |
1345 :param daily_backups: How many recent daily backups should be saved. | 1465 :param daily_backups: How many recent daily backups should be saved. |
1346 | 1466 |
1347 :type weekly_backups: int | 1467 :type weekly_backups: int |
1348 :param weekly_backups: How many recent weekly backups should be saved. | 1468 :param weekly_backups: How many recent weekly backups should be saved. |
1349 """ | 1469 """ |
1350 | 1470 |
1351 # This function first builds up an ordered list of target times that sna
pshots should be saved for | 1471 # This function first builds up an ordered list of target times |
1352 # (last 8 hours, last 7 days, etc.). Then a map of snapshots is construc
ted, with the keys being | 1472 # that snapshots should be saved for (last 8 hours, last 7 days, etc.). |
1353 # the snapshot / volume names and the values being arrays of chornologic
ally sorted snapshots. | 1473 # Then a map of snapshots is constructed, with the keys being |
1354 # Finally, for each array in the map, we go through the snapshot array a
nd the target time array | 1474 # the snapshot / volume names and the values being arrays of |
1355 # in an interleaved fashion, deleting snapshots whose start_times don't
immediately follow a | 1475 # chronologically sorted snapshots. |
1356 # target time (we delete a snapshot if there's another snapshot that was
made closer to the | 1476 # Finally, for each array in the map, we go through the snapshot |
1357 # preceding target time). | 1477 # array and the target time array in an interleaved fashion, |
| 1478 # deleting snapshots whose start_times don't immediately follow a |
| 1479 # target time (we delete a snapshot if there's another snapshot |
| 1480 # that was made closer to the preceding target time). |
1358 | 1481 |
1359 now = datetime.utcnow() # work with UTC time, which is what the snapshot
start time is reported in | 1482 now = datetime.utcnow() |
1360 last_hour = datetime(now.year, now.month, now.day, now.hour) | 1483 last_hour = datetime(now.year, now.month, now.day, now.hour) |
1361 last_midnight = datetime(now.year, now.month, now.day) | 1484 last_midnight = datetime(now.year, now.month, now.day) |
1362 last_sunday = datetime(now.year, now.month, now.day) - timedelta(days =
(now.weekday() + 1) % 7) | 1485 last_sunday = datetime(now.year, now.month, now.day) - timedelta(days =
(now.weekday() + 1) % 7) |
1363 start_of_month = datetime(now.year, now.month, 1) | 1486 start_of_month = datetime(now.year, now.month, 1) |
1364 | 1487 |
1365 target_backup_times = [] | 1488 target_backup_times = [] |
1366 | 1489 |
1367 oldest_snapshot_date = datetime(2007, 1, 1) # there are no snapshots old
er than 1/1/2007 | 1490 # there are no snapshots older than 1/1/2007 |
| 1491 oldest_snapshot_date = datetime(2007, 1, 1) |
1368 | 1492 |
1369 for hour in range(0, hourly_backups): | 1493 for hour in range(0, hourly_backups): |
1370 target_backup_times.append(last_hour - timedelta(hours = hour)) | 1494 target_backup_times.append(last_hour - timedelta(hours = hour)) |
1371 | 1495 |
1372 for day in range(0, daily_backups): | 1496 for day in range(0, daily_backups): |
1373 target_backup_times.append(last_midnight - timedelta(days = day)) | 1497 target_backup_times.append(last_midnight - timedelta(days = day)) |
1374 | 1498 |
1375 for week in range(0, weekly_backups): | 1499 for week in range(0, weekly_backups): |
1376 target_backup_times.append(last_sunday - timedelta(weeks = week)) | 1500 target_backup_times.append(last_sunday - timedelta(weeks = week)) |
1377 | 1501 |
1378 one_day = timedelta(days = 1) | 1502 one_day = timedelta(days = 1) |
1379 while start_of_month > oldest_snapshot_date: | 1503 while start_of_month > oldest_snapshot_date: |
1380 # append the start of the month to the list of snapshot dates to sav
e: | 1504 # append the start of the month to the list of |
| 1505 # snapshot dates to save: |
1381 target_backup_times.append(start_of_month) | 1506 target_backup_times.append(start_of_month) |
1382 # there's no timedelta setting for one month, so instead: | 1507 # there's no timedelta setting for one month, so instead: |
1383 # decrement the day by one, so we go to the final day of the previou
s month... | 1508 # decrement the day by one, so we go to the final day of |
| 1509 # the previous month... |
1384 start_of_month -= one_day | 1510 start_of_month -= one_day |
1385 # ... and then go to the first day of that previous month: | 1511 # ... and then go to the first day of that previous month: |
1386 start_of_month = datetime(start_of_month.year, start_of_month.month,
1) | 1512 start_of_month = datetime(start_of_month.year, |
| 1513 start_of_month.month, 1) |
1387 | 1514 |
1388 temp = [] | 1515 temp = [] |
1389 | 1516 |
1390 for t in target_backup_times: | 1517 for t in target_backup_times: |
1391 if temp.__contains__(t) == False: | 1518 if temp.__contains__(t) == False: |
1392 temp.append(t) | 1519 temp.append(t) |
1393 | 1520 |
1394 target_backup_times = temp | 1521 target_backup_times = temp |
1395 target_backup_times.reverse() # make the oldest date first | 1522 # make the oldeest dates first, and make sure the month start |
| 1523 # and last four week's start are in the proper order |
| 1524 target_backup_times.sort() |
1396 | 1525 |
1397 # get all the snapshots, sort them by date and time, and organize them i
nto one array for each volume: | 1526 # get all the snapshots, sort them by date and time, and |
| 1527 # organize them into one array for each volume: |
1398 all_snapshots = self.get_all_snapshots(owner = 'self') | 1528 all_snapshots = self.get_all_snapshots(owner = 'self') |
1399 all_snapshots.sort(cmp = lambda x, y: cmp(x.start_time, y.start_time)) #
oldest first | 1529 all_snapshots.sort(cmp = lambda x, y: cmp(x.start_time, y.start_time)) |
1400 snaps_for_each_volume = {} | 1530 snaps_for_each_volume = {} |
1401 for snap in all_snapshots: | 1531 for snap in all_snapshots: |
1402 # the snapshot name and the volume name are the same. The snapshot n
ame is set from the volume | 1532 # the snapshot name and the volume name are the same. |
| 1533 # The snapshot name is set from the volume |
1403 # name at the time the snapshot is taken | 1534 # name at the time the snapshot is taken |
1404 volume_name = snap.tags.get('Name') | 1535 volume_name = snap.tags.get('Name') |
1405 if volume_name: | 1536 if volume_name: |
1406 # only examine snapshots that have a volume name | 1537 # only examine snapshots that have a volume name |
1407 snaps_for_volume = snaps_for_each_volume.get(volume_name) | 1538 snaps_for_volume = snaps_for_each_volume.get(volume_name) |
1408 if not snaps_for_volume: | 1539 if not snaps_for_volume: |
1409 snaps_for_volume = [] | 1540 snaps_for_volume = [] |
1410 snaps_for_each_volume[volume_name] = snaps_for_volume | 1541 snaps_for_each_volume[volume_name] = snaps_for_volume |
1411 snaps_for_volume.append(snap) | 1542 snaps_for_volume.append(snap) |
1412 | 1543 |
1413 # Do a running comparison of snapshot dates to desired time periods, kee
ping the oldest snapshot in each | 1544 # Do a running comparison of snapshot dates to desired time |
| 1545 #periods, keeping the oldest snapshot in each |
1414 # time period and deleting the rest: | 1546 # time period and deleting the rest: |
1415 for volume_name in snaps_for_each_volume: | 1547 for volume_name in snaps_for_each_volume: |
1416 snaps = snaps_for_each_volume[volume_name] | 1548 snaps = snaps_for_each_volume[volume_name] |
1417 snaps = snaps[:-1] # never delete the newest snapshot, so remove it
from consideration | 1549 snaps = snaps[:-1] # never delete the newest snapshot |
1418 time_period_number = 0 | 1550 time_period_number = 0 |
1419 snap_found_for_this_time_period = False | 1551 snap_found_for_this_time_period = False |
1420 for snap in snaps: | 1552 for snap in snaps: |
1421 check_this_snap = True | 1553 check_this_snap = True |
1422 while check_this_snap and time_period_number < target_backup_tim
es.__len__(): | 1554 while check_this_snap and time_period_number < target_backup_tim
es.__len__(): |
1423 snap_date = datetime.strptime(snap.start_time, '%Y-%m-%dT%H:
%M:%S.000Z') | 1555 snap_date = datetime.strptime(snap.start_time, |
| 1556 '%Y-%m-%dT%H:%M:%S.000Z') |
1424 if snap_date < target_backup_times[time_period_number]: | 1557 if snap_date < target_backup_times[time_period_number]: |
1425 # the snap date is before the cutoff date. Figure out if
it's the first snap in this | 1558 # the snap date is before the cutoff date. |
1426 # date range and act accordingly (since both date the da
te ranges and the snapshots | 1559 # Figure out if it's the first snap in this |
1427 # are sorted chronologically, we know this snapshot isn'
t in an earlier date range): | 1560 # date range and act accordingly (since both |
| 1561 #date the date ranges and the snapshots |
| 1562 # are sorted chronologically, we know this |
| 1563 #snapshot isn't in an earlier date range): |
1428 if snap_found_for_this_time_period == True: | 1564 if snap_found_for_this_time_period == True: |
1429 if not snap.tags.get('preserve_snapshot'): | 1565 if not snap.tags.get('preserve_snapshot'): |
1430 # as long as the snapshot wasn't marked with the
'preserve_snapshot' tag, delete it: | 1566 # as long as the snapshot wasn't marked |
1431 self.delete_snapshot(snap.id) | 1567 # with the 'preserve_snapshot' tag, delete it: |
1432 boto.log.info('Trimmed snapshot %s (%s)' % (snap
.tags['Name'], snap.start_time)) | 1568 try: |
1433 # go on and look at the next snapshot, leaving the t
ime period alone | 1569 self.delete_snapshot(snap.id) |
| 1570 boto.log.info('Trimmed snapshot %s (%s)' % (
snap.tags['Name'], snap.start_time)) |
| 1571 except EC2ResponseError: |
| 1572 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)) |
| 1573 # go on and look at the next snapshot, |
| 1574 #leaving the time period alone |
1434 else: | 1575 else: |
1435 # this was the first snapshot found for this time pe
riod. Leave it alone and look at the | 1576 # this was the first snapshot found for this |
| 1577 #time period. Leave it alone and look at the |
1436 # next snapshot: | 1578 # next snapshot: |
1437 snap_found_for_this_time_period = True | 1579 snap_found_for_this_time_period = True |
1438 check_this_snap = False | 1580 check_this_snap = False |
1439 else: | 1581 else: |
1440 # the snap is after the cutoff date. Check it against th
e next cutoff date | 1582 # the snap is after the cutoff date. Check it |
| 1583 # against the next cutoff date |
1441 time_period_number += 1 | 1584 time_period_number += 1 |
1442 snap_found_for_this_time_period = False | 1585 snap_found_for_this_time_period = False |
1443 | 1586 |
1444 | 1587 |
1445 def get_snapshot_attribute(self, snapshot_id, | 1588 def get_snapshot_attribute(self, snapshot_id, |
1446 attribute='createVolumePermission'): | 1589 attribute='createVolumePermission'): |
1447 """ | 1590 """ |
1448 Get information about an attribute of a snapshot. Only one attribute | 1591 Get information about an attribute of a snapshot. Only one attribute |
1449 can be specified per call. | 1592 can be specified per call. |
1450 | 1593 |
1451 :type snapshot_id: str | 1594 :type snapshot_id: str |
1452 :param snapshot_id: The ID of the snapshot. | 1595 :param snapshot_id: The ID of the snapshot. |
1453 | 1596 |
1454 :type attribute: str | 1597 :type attribute: str |
1455 :param attribute: The requested attribute. Valid values are: | 1598 :param attribute: The requested attribute. Valid values are: |
1456 | 1599 |
1457 * createVolumePermission | 1600 * createVolumePermission |
1458 | 1601 |
1459 :rtype: list of :class:`boto.ec2.snapshotattribute.SnapshotAttribute` | 1602 :rtype: list of :class:`boto.ec2.snapshotattribute.SnapshotAttribute` |
1460 :return: The requested Snapshot attribute | 1603 :return: The requested Snapshot attribute |
1461 """ | 1604 """ |
1462 params = {'Attribute' : attribute} | 1605 params = {'Attribute' : attribute} |
1463 if snapshot_id: | 1606 if snapshot_id: |
1464 params['SnapshotId'] = snapshot_id | 1607 params['SnapshotId'] = snapshot_id |
1465 return self.get_object('DescribeSnapshotAttribute', params, | 1608 return self.get_object('DescribeSnapshotAttribute', params, |
1466 SnapshotAttribute, verb='POST') | 1609 SnapshotAttribute, verb='POST') |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1538 for details. | 1681 for details. |
1539 | 1682 |
1540 :rtype: list | 1683 :rtype: list |
1541 :return: A list of :class:`boto.ec2.keypair.KeyPair` | 1684 :return: A list of :class:`boto.ec2.keypair.KeyPair` |
1542 """ | 1685 """ |
1543 params = {} | 1686 params = {} |
1544 if keynames: | 1687 if keynames: |
1545 self.build_list_params(params, keynames, 'KeyName') | 1688 self.build_list_params(params, keynames, 'KeyName') |
1546 if filters: | 1689 if filters: |
1547 self.build_filter_params(params, filters) | 1690 self.build_filter_params(params, filters) |
1548 return self.get_list('DescribeKeyPairs', params, [('item', KeyPair)], ve
rb='POST') | 1691 return self.get_list('DescribeKeyPairs', params, |
| 1692 [('item', KeyPair)], verb='POST') |
1549 | 1693 |
1550 def get_key_pair(self, keyname): | 1694 def get_key_pair(self, keyname): |
1551 """ | 1695 """ |
1552 Convenience method to retrieve a specific keypair (KeyPair). | 1696 Convenience method to retrieve a specific keypair (KeyPair). |
1553 | 1697 |
1554 :type image_id: string | 1698 :type image_id: string |
1555 :param image_id: the ID of the Image to retrieve | 1699 :param image_id: the ID of the Image to retrieve |
1556 | 1700 |
1557 :rtype: :class:`boto.ec2.keypair.KeyPair` | 1701 :rtype: :class:`boto.ec2.keypair.KeyPair` |
1558 :return: The KeyPair specified or None if it is not found | 1702 :return: The KeyPair specified or None if it is not found |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1614 :type public_key_material: string | 1758 :type public_key_material: string |
1615 :param public_key_material: The public key. You must base64 encode | 1759 :param public_key_material: The public key. You must base64 encode |
1616 the public key material before sending | 1760 the public key material before sending |
1617 it to AWS. | 1761 it to AWS. |
1618 | 1762 |
1619 :rtype: :class:`boto.ec2.keypair.KeyPair` | 1763 :rtype: :class:`boto.ec2.keypair.KeyPair` |
1620 :return: The newly created :class:`boto.ec2.keypair.KeyPair`. | 1764 :return: The newly created :class:`boto.ec2.keypair.KeyPair`. |
1621 The material attribute of the new KeyPair object | 1765 The material attribute of the new KeyPair object |
1622 will contain the the unencrypted PEM encoded RSA private key. | 1766 will contain the the unencrypted PEM encoded RSA private key. |
1623 """ | 1767 """ |
| 1768 public_key_material = base64.b64encode(public_key_material) |
1624 params = {'KeyName' : key_name, | 1769 params = {'KeyName' : key_name, |
1625 'PublicKeyMaterial' : public_key_material} | 1770 'PublicKeyMaterial' : public_key_material} |
1626 return self.get_object('ImportKeyPair', params, KeyPair, verb='POST') | 1771 return self.get_object('ImportKeyPair', params, KeyPair, verb='POST') |
1627 | 1772 |
1628 # SecurityGroup methods | 1773 # SecurityGroup methods |
1629 | 1774 |
1630 def get_all_security_groups(self, groupnames=None, filters=None): | 1775 def get_all_security_groups(self, groupnames=None, group_ids=None, filters=N
one): |
1631 """ | 1776 """ |
1632 Get all security groups associated with your account in a region. | 1777 Get all security groups associated with your account in a region. |
1633 | 1778 |
1634 :type groupnames: list | 1779 :type groupnames: list |
1635 :param groupnames: A list of the names of security groups to retrieve. | 1780 :param groupnames: A list of the names of security groups to retrieve. |
1636 If not provided, all security groups will be | 1781 If not provided, all security groups will be |
1637 returned. | 1782 returned. |
1638 | 1783 |
| 1784 :type group_ids: list |
| 1785 :param group_ids: A list of IDs of security groups to retrieve for |
| 1786 security groups within a VPC. |
| 1787 |
1639 :type filters: dict | 1788 :type filters: dict |
1640 :param filters: Optional filters that can be used to limit | 1789 :param filters: Optional filters that can be used to limit |
1641 the results returned. Filters are provided | 1790 the results returned. Filters are provided |
1642 in the form of a dictionary consisting of | 1791 in the form of a dictionary consisting of |
1643 filter names as the key and filter values | 1792 filter names as the key and filter values |
1644 as the value. The set of allowable filter | 1793 as the value. The set of allowable filter |
1645 names/values is dependent on the request | 1794 names/values is dependent on the request |
1646 being performed. Check the EC2 API guide | 1795 being performed. Check the EC2 API guide |
1647 for details. | 1796 for details. |
1648 | 1797 |
1649 :rtype: list | 1798 :rtype: list |
1650 :return: A list of :class:`boto.ec2.securitygroup.SecurityGroup` | 1799 :return: A list of :class:`boto.ec2.securitygroup.SecurityGroup` |
1651 """ | 1800 """ |
1652 params = {} | 1801 params = {} |
1653 if groupnames: | 1802 if groupnames is not None: |
1654 self.build_list_params(params, groupnames, 'GroupName') | 1803 self.build_list_params(params, groupnames, 'GroupName') |
1655 if filters: | 1804 if group_ids is not None: |
| 1805 self.build_list_params(params, group_ids, 'GroupId') |
| 1806 if filters is not None: |
1656 self.build_filter_params(params, filters) | 1807 self.build_filter_params(params, filters) |
| 1808 |
1657 return self.get_list('DescribeSecurityGroups', params, | 1809 return self.get_list('DescribeSecurityGroups', params, |
1658 [('item', SecurityGroup)], verb='POST') | 1810 [('item', SecurityGroup)], verb='POST') |
1659 | 1811 |
1660 def create_security_group(self, name, description): | 1812 def create_security_group(self, name, description, vpc_id=None): |
1661 """ | 1813 """ |
1662 Create a new security group for your account. | 1814 Create a new security group for your account. |
1663 This will create the security group within the region you | 1815 This will create the security group within the region you |
1664 are currently connected to. | 1816 are currently connected to. |
1665 | 1817 |
1666 :type name: string | 1818 :type name: string |
1667 :param name: The name of the new security group | 1819 :param name: The name of the new security group |
1668 | 1820 |
1669 :type description: string | 1821 :type description: string |
1670 :param description: The description of the new security group | 1822 :param description: The description of the new security group |
1671 | 1823 |
| 1824 :type vpc_id: string |
| 1825 :param vpc_id: The ID of the VPC to create the security group in, |
| 1826 if any. |
| 1827 |
1672 :rtype: :class:`boto.ec2.securitygroup.SecurityGroup` | 1828 :rtype: :class:`boto.ec2.securitygroup.SecurityGroup` |
1673 :return: The newly created :class:`boto.ec2.keypair.KeyPair`. | 1829 :return: The newly created :class:`boto.ec2.keypair.KeyPair`. |
1674 """ | 1830 """ |
1675 params = {'GroupName':name, 'GroupDescription':description} | 1831 params = { |
1676 group = self.get_object('CreateSecurityGroup', params, SecurityGroup, ve
rb='POST') | 1832 'GroupName': name, |
| 1833 'GroupDescription': description |
| 1834 } |
| 1835 |
| 1836 if vpc_id is not None: |
| 1837 params['VpcId'] = vpc_id |
| 1838 |
| 1839 group = self.get_object('CreateSecurityGroup', params, |
| 1840 SecurityGroup, verb='POST') |
1677 group.name = name | 1841 group.name = name |
1678 group.description = description | 1842 group.description = description |
1679 return group | 1843 return group |
1680 | 1844 |
1681 def delete_security_group(self, name): | 1845 def delete_security_group(self, name=None, group_id=None): |
1682 """ | 1846 """ |
1683 Delete a security group from your account. | 1847 Delete a security group from your account. |
1684 | 1848 |
1685 :type key_name: string | 1849 :type name: string |
1686 :param key_name: The name of the keypair to delete | 1850 :param name: The name of the security group to delete. |
| 1851 |
| 1852 :type group_id: string |
| 1853 :param group_id: The ID of the security group to delete within |
| 1854 a VPC. |
| 1855 |
| 1856 :rtype: bool |
| 1857 :return: True if successful. |
1687 """ | 1858 """ |
1688 params = {'GroupName':name} | 1859 params = {} |
| 1860 |
| 1861 if name is not None: |
| 1862 params['GroupName'] = name |
| 1863 elif group_id is not None: |
| 1864 params['GroupId'] = group_id |
| 1865 |
1689 return self.get_status('DeleteSecurityGroup', params, verb='POST') | 1866 return self.get_status('DeleteSecurityGroup', params, verb='POST') |
1690 | 1867 |
1691 def _authorize_deprecated(self, group_name, src_security_group_name=None, | 1868 def authorize_security_group_deprecated(self, group_name, |
1692 src_security_group_owner_id=None): | 1869 src_security_group_name=None, |
| 1870 src_security_group_owner_id=None, |
| 1871 ip_protocol=None, |
| 1872 from_port=None, to_port=None, |
| 1873 cidr_ip=None): |
1693 """ | 1874 """ |
1694 This method is called only when someone tries to authorize a group | 1875 NOTE: This method uses the old-style request parameters |
1695 without specifying a from_port or to_port. Until recently, that was | 1876 that did not allow a port to be specified when |
1696 the only way to do group authorization but the EC2 API has been | 1877 authorizing a group. |
1697 changed to now require a from_port and to_port when specifying a | |
1698 group. This is a much better approach but I don't want to break | |
1699 existing boto applications that depend on the old behavior, hence | |
1700 this kludge. | |
1701 | 1878 |
1702 :type group_name: string | 1879 :type group_name: string |
1703 :param group_name: The name of the security group you are adding | 1880 :param group_name: The name of the security group you are adding |
1704 the rule to. | 1881 the rule to. |
1705 | 1882 |
1706 :type src_security_group_name: string | 1883 :type src_security_group_name: string |
1707 :param src_security_group_name: The name of the security group you are | 1884 :param src_security_group_name: The name of the security group you are |
1708 granting access to. | 1885 granting access to. |
1709 | 1886 |
1710 :type src_security_group_owner_id: string | 1887 :type src_security_group_owner_id: string |
1711 :param src_security_group_owner_id: The ID of the owner of the security | 1888 :param src_security_group_owner_id: The ID of the owner of the security |
1712 group you are granting access to. | 1889 group you are granting access to. |
1713 | 1890 |
| 1891 :type ip_protocol: string |
| 1892 :param ip_protocol: Either tcp | udp | icmp |
| 1893 |
| 1894 :type from_port: int |
| 1895 :param from_port: The beginning port number you are enabling |
| 1896 |
| 1897 :type to_port: int |
| 1898 :param to_port: The ending port number you are enabling |
| 1899 |
| 1900 :type to_port: string |
| 1901 :param to_port: The CIDR block you are providing access to. |
| 1902 See http://goo.gl/Yj5QC |
| 1903 |
1714 :rtype: bool | 1904 :rtype: bool |
1715 :return: True if successful. | 1905 :return: True if successful. |
1716 """ | 1906 """ |
1717 warnings.warn('FromPort and ToPort now required for group authorization'
, | |
1718 DeprecationWarning) | |
1719 params = {'GroupName':group_name} | 1907 params = {'GroupName':group_name} |
1720 if src_security_group_name: | 1908 if src_security_group_name: |
1721 params['SourceSecurityGroupName'] = src_security_group_name | 1909 params['SourceSecurityGroupName'] = src_security_group_name |
1722 if src_security_group_owner_id: | 1910 if src_security_group_owner_id: |
1723 params['SourceSecurityGroupOwnerId'] = src_security_group_owner_id | 1911 params['SourceSecurityGroupOwnerId'] = src_security_group_owner_id |
1724 return self.get_status('AuthorizeSecurityGroupIngress', params, verb='PO
ST') | 1912 if ip_protocol: |
| 1913 params['IpProtocol'] = ip_protocol |
| 1914 if from_port: |
| 1915 params['FromPort'] = from_port |
| 1916 if to_port: |
| 1917 params['ToPort'] = to_port |
| 1918 if cidr_ip: |
| 1919 params['CidrIp'] = cidr_ip |
| 1920 return self.get_status('AuthorizeSecurityGroupIngress', params) |
1725 | 1921 |
1726 def authorize_security_group(self, group_name, src_security_group_name=None, | 1922 def authorize_security_group(self, group_name=None, |
| 1923 src_security_group_name=None, |
1727 src_security_group_owner_id=None, | 1924 src_security_group_owner_id=None, |
1728 ip_protocol=None, from_port=None, to_port=None, | 1925 ip_protocol=None, from_port=None, to_port=None, |
1729 cidr_ip=None): | 1926 cidr_ip=None, group_id=None, |
| 1927 src_security_group_group_id=None): |
1730 """ | 1928 """ |
1731 Add a new rule to an existing security group. | 1929 Add a new rule to an existing security group. |
1732 You need to pass in either src_security_group_name and | 1930 You need to pass in either src_security_group_name and |
1733 src_security_group_owner_id OR ip_protocol, from_port, to_port, | 1931 src_security_group_owner_id OR ip_protocol, from_port, to_port, |
1734 and cidr_ip. In other words, either you are authorizing another | 1932 and cidr_ip. In other words, either you are authorizing another |
1735 group or you are authorizing some ip-based rule. | 1933 group or you are authorizing some ip-based rule. |
1736 | 1934 |
1737 :type group_name: string | 1935 :type group_name: string |
1738 :param group_name: The name of the security group you are adding | 1936 :param group_name: The name of the security group you are adding |
1739 the rule to. | 1937 the rule to. |
(...skipping 10 matching lines...) Expand all Loading... |
1750 :param ip_protocol: Either tcp | udp | icmp | 1948 :param ip_protocol: Either tcp | udp | icmp |
1751 | 1949 |
1752 :type from_port: int | 1950 :type from_port: int |
1753 :param from_port: The beginning port number you are enabling | 1951 :param from_port: The beginning port number you are enabling |
1754 | 1952 |
1755 :type to_port: int | 1953 :type to_port: int |
1756 :param to_port: The ending port number you are enabling | 1954 :param to_port: The ending port number you are enabling |
1757 | 1955 |
1758 :type cidr_ip: string | 1956 :type cidr_ip: string |
1759 :param cidr_ip: The CIDR block you are providing access to. | 1957 :param cidr_ip: The CIDR block you are providing access to. |
1760 See http://en.wikipedia.org/wiki/Classless_Inter-Domain_
Routing | 1958 See http://goo.gl/Yj5QC |
| 1959 |
| 1960 :type group_id: string |
| 1961 :param group_id: ID of the EC2 or VPC security group to modify. |
| 1962 This is required for VPC security groups and |
| 1963 can be used instead of group_name for EC2 |
| 1964 security groups. |
| 1965 |
| 1966 :type group_id: string |
| 1967 :param group_id: ID of the EC2 or VPC source security group. |
| 1968 This is required for VPC security groups and |
| 1969 can be used instead of group_name for EC2 |
| 1970 security groups. |
1761 | 1971 |
1762 :rtype: bool | 1972 :rtype: bool |
1763 :return: True if successful. | 1973 :return: True if successful. |
1764 """ | 1974 """ |
1765 if src_security_group_name: | 1975 if src_security_group_name: |
1766 if from_port is None and to_port is None and ip_protocol is None: | 1976 if from_port is None and to_port is None and ip_protocol is None: |
1767 return self._authorize_deprecated(group_name, | 1977 return self.authorize_security_group_deprecated( |
1768 src_security_group_name, | 1978 group_name, src_security_group_name, |
1769 src_security_group_owner_id) | 1979 src_security_group_owner_id) |
1770 params = {'GroupName':group_name} | 1980 |
| 1981 params = {} |
| 1982 |
| 1983 if group_name: |
| 1984 params['GroupName'] = group_name |
| 1985 if group_id: |
| 1986 params['GroupId'] = group_id |
1771 if src_security_group_name: | 1987 if src_security_group_name: |
1772 params['IpPermissions.1.Groups.1.GroupName'] = src_security_group_na
me | 1988 param_name = 'IpPermissions.1.Groups.1.GroupName' |
| 1989 params[param_name] = src_security_group_name |
1773 if src_security_group_owner_id: | 1990 if src_security_group_owner_id: |
1774 params['IpPermissions.1.Groups.1.UserId'] = src_security_group_owner
_id | 1991 param_name = 'IpPermissions.1.Groups.1.UserId' |
| 1992 params[param_name] = src_security_group_owner_id |
| 1993 if src_security_group_group_id: |
| 1994 param_name = 'IpPermissions.1.Groups.1.GroupId' |
| 1995 params[param_name] = src_security_group_group_id |
1775 if ip_protocol: | 1996 if ip_protocol: |
1776 params['IpPermissions.1.IpProtocol'] = ip_protocol | 1997 params['IpPermissions.1.IpProtocol'] = ip_protocol |
1777 if from_port: | 1998 if from_port is not None: |
1778 params['IpPermissions.1.FromPort'] = from_port | 1999 params['IpPermissions.1.FromPort'] = from_port |
1779 if to_port: | 2000 if to_port is not None: |
1780 params['IpPermissions.1.ToPort'] = to_port | 2001 params['IpPermissions.1.ToPort'] = to_port |
1781 if cidr_ip: | 2002 if cidr_ip: |
1782 params['IpPermissions.1.IpRanges.1.CidrIp'] = cidr_ip | 2003 params['IpPermissions.1.IpRanges.1.CidrIp'] = cidr_ip |
1783 return self.get_status('AuthorizeSecurityGroupIngress', params, verb='PO
ST') | |
1784 | 2004 |
1785 def _revoke_deprecated(self, group_name, src_security_group_name=None, | 2005 return self.get_status('AuthorizeSecurityGroupIngress', |
1786 src_security_group_owner_id=None): | 2006 params, verb='POST') |
| 2007 |
| 2008 def authorize_security_group_egress(group_id, |
| 2009 ip_protocol, |
| 2010 from_port=None, |
| 2011 to_port=None, |
| 2012 src_group_id=None, |
| 2013 cidr_ip=None): |
1787 """ | 2014 """ |
1788 This method is called only when someone tries to revoke a group | 2015 The action adds one or more egress rules to a VPC security |
1789 without specifying a from_port or to_port. Until recently, that was | 2016 group. Specifically, this action permits instances in a |
1790 the only way to do group revocation but the EC2 API has been | 2017 security group to send traffic to one or more destination |
1791 changed to now require a from_port and to_port when specifying a | 2018 CIDR IP address ranges, or to one or more destination |
1792 group. This is a much better approach but I don't want to break | 2019 security groups in the same VPC. |
1793 existing boto applications that depend on the old behavior, hence | 2020 """ |
1794 this kludge. | 2021 params = { |
| 2022 'GroupId': group_id, |
| 2023 'IpPermissions.1.IpProtocol': ip_protocol |
| 2024 } |
| 2025 |
| 2026 if from_port is not None: |
| 2027 params['IpPermissions.1.FromPort'] = from_port |
| 2028 if to_port is not None: |
| 2029 params['IpPermissions.1.ToPort'] = to_port |
| 2030 if src_group_id is not None: |
| 2031 params['IpPermissions.1.Groups.1.GroupId'] = src_group_id |
| 2032 if cidr_ip is not None: |
| 2033 params['IpPermissions.1.Groups.1.CidrIp'] = cidr_ip |
| 2034 |
| 2035 return self.get_status('AuthorizeSecurityGroupEgress', |
| 2036 params, verb='POST') |
| 2037 |
| 2038 def revoke_security_group_deprecated(self, group_name, |
| 2039 src_security_group_name=None, |
| 2040 src_security_group_owner_id=None, |
| 2041 ip_protocol=None, |
| 2042 from_port=None, to_port=None, |
| 2043 cidr_ip=None): |
| 2044 """ |
| 2045 NOTE: This method uses the old-style request parameters |
| 2046 that did not allow a port to be specified when |
| 2047 authorizing a group. |
| 2048 |
| 2049 Remove an existing rule from an existing security group. |
| 2050 You need to pass in either src_security_group_name and |
| 2051 src_security_group_owner_id OR ip_protocol, from_port, to_port, |
| 2052 and cidr_ip. In other words, either you are revoking another |
| 2053 group or you are revoking some ip-based rule. |
1795 | 2054 |
1796 :type group_name: string | 2055 :type group_name: string |
1797 :param group_name: The name of the security group you are adding | 2056 :param group_name: The name of the security group you are removing |
1798 the rule to. | 2057 the rule from. |
1799 | 2058 |
1800 :type src_security_group_name: string | 2059 :type src_security_group_name: string |
1801 :param src_security_group_name: The name of the security group you are | 2060 :param src_security_group_name: The name of the security group you are |
1802 granting access to. | 2061 revoking access to. |
1803 | 2062 |
1804 :type src_security_group_owner_id: string | 2063 :type src_security_group_owner_id: string |
1805 :param src_security_group_owner_id: The ID of the owner of the security | 2064 :param src_security_group_owner_id: The ID of the owner of the security |
1806 group you are granting access to. | 2065 group you are revoking access to. |
| 2066 |
| 2067 :type ip_protocol: string |
| 2068 :param ip_protocol: Either tcp | udp | icmp |
| 2069 |
| 2070 :type from_port: int |
| 2071 :param from_port: The beginning port number you are disabling |
| 2072 |
| 2073 :type to_port: int |
| 2074 :param to_port: The ending port number you are disabling |
| 2075 |
| 2076 :type to_port: string |
| 2077 :param to_port: The CIDR block you are revoking access to. |
| 2078 http://goo.gl/Yj5QC |
| 2079 |
| 2080 :type group_id: string |
| 2081 :param group_id: ID of the EC2 or VPC security group to modify. |
| 2082 This is required for VPC security groups and |
| 2083 can be used instead of group_name for EC2 |
| 2084 security groups. |
| 2085 |
| 2086 :type group_id: string |
| 2087 :param group_id: ID of the EC2 or VPC source security group. |
| 2088 This is required for VPC security groups and |
| 2089 can be used instead of group_name for EC2 |
| 2090 security groups. |
1807 | 2091 |
1808 :rtype: bool | 2092 :rtype: bool |
1809 :return: True if successful. | 2093 :return: True if successful. |
1810 """ | 2094 """ |
1811 warnings.warn('FromPort and ToPort now required for group authorization'
, | |
1812 DeprecationWarning) | |
1813 params = {'GroupName':group_name} | 2095 params = {'GroupName':group_name} |
1814 if src_security_group_name: | 2096 if src_security_group_name: |
1815 params['SourceSecurityGroupName'] = src_security_group_name | 2097 params['SourceSecurityGroupName'] = src_security_group_name |
1816 if src_security_group_owner_id: | 2098 if src_security_group_owner_id: |
1817 params['SourceSecurityGroupOwnerId'] = src_security_group_owner_id | 2099 params['SourceSecurityGroupOwnerId'] = src_security_group_owner_id |
1818 return self.get_status('RevokeSecurityGroupIngress', params, verb='POST'
) | 2100 if ip_protocol: |
| 2101 params['IpProtocol'] = ip_protocol |
| 2102 if from_port: |
| 2103 params['FromPort'] = from_port |
| 2104 if to_port: |
| 2105 params['ToPort'] = to_port |
| 2106 if cidr_ip: |
| 2107 params['CidrIp'] = cidr_ip |
| 2108 return self.get_status('RevokeSecurityGroupIngress', params) |
1819 | 2109 |
1820 def revoke_security_group(self, group_name, src_security_group_name=None, | 2110 def revoke_security_group(self, group_name, src_security_group_name=None, |
1821 src_security_group_owner_id=None, | 2111 src_security_group_owner_id=None, |
1822 ip_protocol=None, from_port=None, to_port=None, | 2112 ip_protocol=None, from_port=None, to_port=None, |
1823 cidr_ip=None): | 2113 cidr_ip=None, group_id=None, |
| 2114 src_security_group_group_id=None): |
1824 """ | 2115 """ |
1825 Remove an existing rule from an existing security group. | 2116 Remove an existing rule from an existing security group. |
1826 You need to pass in either src_security_group_name and | 2117 You need to pass in either src_security_group_name and |
1827 src_security_group_owner_id OR ip_protocol, from_port, to_port, | 2118 src_security_group_owner_id OR ip_protocol, from_port, to_port, |
1828 and cidr_ip. In other words, either you are revoking another | 2119 and cidr_ip. In other words, either you are revoking another |
1829 group or you are revoking some ip-based rule. | 2120 group or you are revoking some ip-based rule. |
1830 | 2121 |
1831 :type group_name: string | 2122 :type group_name: string |
1832 :param group_name: The name of the security group you are removing | 2123 :param group_name: The name of the security group you are removing |
1833 the rule from. | 2124 the rule from. |
(...skipping 10 matching lines...) Expand all Loading... |
1844 :param ip_protocol: Either tcp | udp | icmp | 2135 :param ip_protocol: Either tcp | udp | icmp |
1845 | 2136 |
1846 :type from_port: int | 2137 :type from_port: int |
1847 :param from_port: The beginning port number you are disabling | 2138 :param from_port: The beginning port number you are disabling |
1848 | 2139 |
1849 :type to_port: int | 2140 :type to_port: int |
1850 :param to_port: The ending port number you are disabling | 2141 :param to_port: The ending port number you are disabling |
1851 | 2142 |
1852 :type cidr_ip: string | 2143 :type cidr_ip: string |
1853 :param cidr_ip: The CIDR block you are revoking access to. | 2144 :param cidr_ip: The CIDR block you are revoking access to. |
1854 See http://en.wikipedia.org/wiki/Classless_Inter-Domain_
Routing | 2145 See http://goo.gl/Yj5QC |
1855 | 2146 |
1856 :rtype: bool | 2147 :rtype: bool |
1857 :return: True if successful. | 2148 :return: True if successful. |
1858 """ | 2149 """ |
1859 if src_security_group_name: | 2150 if src_security_group_name: |
1860 if from_port is None and to_port is None and ip_protocol is None: | 2151 if from_port is None and to_port is None and ip_protocol is None: |
1861 return self._revoke_deprecated(group_name, | 2152 return self.revoke_security_group_deprecated( |
1862 src_security_group_name, | 2153 group_name, src_security_group_name, |
1863 src_security_group_owner_id) | 2154 src_security_group_owner_id) |
1864 params = {'GroupName':group_name} | 2155 params = {} |
| 2156 if group_name: |
| 2157 params['GroupName'] = group_name |
1865 if src_security_group_name: | 2158 if src_security_group_name: |
1866 params['IpPermissions.1.Groups.1.GroupName'] = src_security_group_na
me | 2159 param_name = 'IpPermissions.1.Groups.1.GroupName' |
| 2160 params[param_name] = src_security_group_name |
1867 if src_security_group_owner_id: | 2161 if src_security_group_owner_id: |
1868 params['IpPermissions.1.Groups.1.UserId'] = src_security_group_owner
_id | 2162 param_name = 'IpPermissions.1.Groups.1.UserId' |
| 2163 params[param_name] = src_security_group_owner_id |
1869 if ip_protocol: | 2164 if ip_protocol: |
1870 params['IpPermissions.1.IpProtocol'] = ip_protocol | 2165 params['IpPermissions.1.IpProtocol'] = ip_protocol |
1871 if from_port: | 2166 if from_port is not None: |
1872 params['IpPermissions.1.FromPort'] = from_port | 2167 params['IpPermissions.1.FromPort'] = from_port |
1873 if to_port: | 2168 if to_port is not None: |
1874 params['IpPermissions.1.ToPort'] = to_port | 2169 params['IpPermissions.1.ToPort'] = to_port |
1875 if cidr_ip: | 2170 if cidr_ip: |
1876 params['IpPermissions.1.IpRanges.1.CidrIp'] = cidr_ip | 2171 params['IpPermissions.1.IpRanges.1.CidrIp'] = cidr_ip |
1877 return self.get_status('RevokeSecurityGroupIngress', params, verb='POST'
) | 2172 return self.get_status('RevokeSecurityGroupIngress', |
| 2173 params, verb='POST') |
1878 | 2174 |
1879 # | 2175 # |
1880 # Regions | 2176 # Regions |
1881 # | 2177 # |
1882 | 2178 |
1883 def get_all_regions(self, region_names=None, filters=None): | 2179 def get_all_regions(self, region_names=None, filters=None): |
1884 """ | 2180 """ |
1885 Get all available regions for the EC2 service. | 2181 Get all available regions for the EC2 service. |
1886 | 2182 |
1887 :type region_names: list of str | 2183 :type region_names: list of str |
(...skipping 10 matching lines...) Expand all Loading... |
1898 for details. | 2194 for details. |
1899 | 2195 |
1900 :rtype: list | 2196 :rtype: list |
1901 :return: A list of :class:`boto.ec2.regioninfo.RegionInfo` | 2197 :return: A list of :class:`boto.ec2.regioninfo.RegionInfo` |
1902 """ | 2198 """ |
1903 params = {} | 2199 params = {} |
1904 if region_names: | 2200 if region_names: |
1905 self.build_list_params(params, region_names, 'RegionName') | 2201 self.build_list_params(params, region_names, 'RegionName') |
1906 if filters: | 2202 if filters: |
1907 self.build_filter_params(params, filters) | 2203 self.build_filter_params(params, filters) |
1908 regions = self.get_list('DescribeRegions', params, [('item', RegionInfo
)], verb='POST') | 2204 regions = self.get_list('DescribeRegions', params, |
| 2205 [('item', RegionInfo)], verb='POST') |
1909 for region in regions: | 2206 for region in regions: |
1910 region.connection_cls = EC2Connection | 2207 region.connection_cls = EC2Connection |
1911 return regions | 2208 return regions |
1912 | 2209 |
1913 # | 2210 # |
1914 # Reservation methods | 2211 # Reservation methods |
1915 # | 2212 # |
1916 | 2213 |
1917 def get_all_reserved_instances_offerings(self, reserved_instances_id=None, | 2214 def get_all_reserved_instances_offerings(self, reserved_instances_id=None, |
1918 instance_type=None, | 2215 instance_type=None, |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1957 if instance_type: | 2254 if instance_type: |
1958 params['InstanceType'] = instance_type | 2255 params['InstanceType'] = instance_type |
1959 if availability_zone: | 2256 if availability_zone: |
1960 params['AvailabilityZone'] = availability_zone | 2257 params['AvailabilityZone'] = availability_zone |
1961 if product_description: | 2258 if product_description: |
1962 params['ProductDescription'] = product_description | 2259 params['ProductDescription'] = product_description |
1963 if filters: | 2260 if filters: |
1964 self.build_filter_params(params, filters) | 2261 self.build_filter_params(params, filters) |
1965 | 2262 |
1966 return self.get_list('DescribeReservedInstancesOfferings', | 2263 return self.get_list('DescribeReservedInstancesOfferings', |
1967 params, [('item', ReservedInstancesOffering)], verb
='POST') | 2264 params, [('item', ReservedInstancesOffering)], |
| 2265 verb='POST') |
1968 | 2266 |
1969 def get_all_reserved_instances(self, reserved_instances_id=None, | 2267 def get_all_reserved_instances(self, reserved_instances_id=None, |
1970 filters=None): | 2268 filters=None): |
1971 """ | 2269 """ |
1972 Describes Reserved Instance offerings that are available for purchase. | 2270 Describes Reserved Instance offerings that are available for purchase. |
1973 | 2271 |
1974 :type reserved_instance_ids: list | 2272 :type reserved_instance_ids: list |
1975 :param reserved_instance_ids: A list of the reserved instance ids that | 2273 :param reserved_instance_ids: A list of the reserved instance ids that |
1976 will be returned. If not provided, all | 2274 will be returned. If not provided, all |
1977 reserved instances will be returned. | 2275 reserved instances will be returned. |
(...skipping 13 matching lines...) Expand all Loading... |
1991 """ | 2289 """ |
1992 params = {} | 2290 params = {} |
1993 if reserved_instances_id: | 2291 if reserved_instances_id: |
1994 self.build_list_params(params, reserved_instances_id, | 2292 self.build_list_params(params, reserved_instances_id, |
1995 'ReservedInstancesId') | 2293 'ReservedInstancesId') |
1996 if filters: | 2294 if filters: |
1997 self.build_filter_params(params, filters) | 2295 self.build_filter_params(params, filters) |
1998 return self.get_list('DescribeReservedInstances', | 2296 return self.get_list('DescribeReservedInstances', |
1999 params, [('item', ReservedInstance)], verb='POST') | 2297 params, [('item', ReservedInstance)], verb='POST') |
2000 | 2298 |
2001 def purchase_reserved_instance_offering(self, reserved_instances_offering_id
, | 2299 def purchase_reserved_instance_offering(self, |
| 2300 reserved_instances_offering_id, |
2002 instance_count=1): | 2301 instance_count=1): |
2003 """ | 2302 """ |
2004 Purchase a Reserved Instance for use with your account. | 2303 Purchase a Reserved Instance for use with your account. |
2005 ** CAUTION ** | 2304 ** CAUTION ** |
2006 This request can result in large amounts of money being charged to your | 2305 This request can result in large amounts of money being charged to your |
2007 AWS account. Use with caution! | 2306 AWS account. Use with caution! |
2008 | 2307 |
2009 :type reserved_instances_offering_id: string | 2308 :type reserved_instances_offering_id: string |
2010 :param reserved_instances_offering_id: The offering ID of the Reserved | 2309 :param reserved_instances_offering_id: The offering ID of the Reserved |
2011 Instance to purchase | 2310 Instance to purchase |
2012 | 2311 |
2013 :type instance_count: int | 2312 :type instance_count: int |
2014 :param instance_count: The number of Reserved Instances to purchase. | 2313 :param instance_count: The number of Reserved Instances to purchase. |
2015 Default value is 1. | 2314 Default value is 1. |
2016 | 2315 |
2017 :rtype: :class:`boto.ec2.reservedinstance.ReservedInstance` | 2316 :rtype: :class:`boto.ec2.reservedinstance.ReservedInstance` |
2018 :return: The newly created Reserved Instance | 2317 :return: The newly created Reserved Instance |
2019 """ | 2318 """ |
2020 params = {'ReservedInstancesOfferingId' : reserved_instances_offering_id
, | 2319 params = { |
2021 'InstanceCount' : instance_count} | 2320 'ReservedInstancesOfferingId' : reserved_instances_offering_id, |
| 2321 'InstanceCount' : instance_count} |
2022 return self.get_object('PurchaseReservedInstancesOffering', params, | 2322 return self.get_object('PurchaseReservedInstancesOffering', params, |
2023 ReservedInstance, verb='POST') | 2323 ReservedInstance, verb='POST') |
2024 | 2324 |
2025 # | 2325 # |
2026 # Monitoring | 2326 # Monitoring |
2027 # | 2327 # |
2028 | 2328 |
| 2329 def monitor_instances(self, instance_ids): |
| 2330 """ |
| 2331 Enable CloudWatch monitoring for the supplied instances. |
| 2332 |
| 2333 :type instance_id: list of strings |
| 2334 :param instance_id: The instance ids |
| 2335 |
| 2336 :rtype: list |
| 2337 :return: A list of :class:`boto.ec2.instanceinfo.InstanceInfo` |
| 2338 """ |
| 2339 params = {} |
| 2340 self.build_list_params(params, instance_ids, 'InstanceId') |
| 2341 return self.get_list('MonitorInstances', params, |
| 2342 [('item', InstanceInfo)], verb='POST') |
| 2343 |
2029 def monitor_instance(self, instance_id): | 2344 def monitor_instance(self, instance_id): |
2030 """ | 2345 """ |
| 2346 Deprecated Version, maintained for backward compatibility. |
2031 Enable CloudWatch monitoring for the supplied instance. | 2347 Enable CloudWatch monitoring for the supplied instance. |
2032 | 2348 |
2033 :type instance_id: string | 2349 :type instance_id: string |
2034 :param instance_id: The instance id | 2350 :param instance_id: The instance id |
2035 | 2351 |
2036 :rtype: list | 2352 :rtype: list |
2037 :return: A list of :class:`boto.ec2.instanceinfo.InstanceInfo` | 2353 :return: A list of :class:`boto.ec2.instanceinfo.InstanceInfo` |
2038 """ | 2354 """ |
2039 params = {'InstanceId' : instance_id} | 2355 return self.monitor_instances([instance_id]) |
2040 return self.get_list('MonitorInstances', params, | 2356 |
| 2357 def unmonitor_instances(self, instance_ids): |
| 2358 """ |
| 2359 Disable CloudWatch monitoring for the supplied instance. |
| 2360 |
| 2361 :type instance_id: list of string |
| 2362 :param instance_id: The instance id |
| 2363 |
| 2364 :rtype: list |
| 2365 :return: A list of :class:`boto.ec2.instanceinfo.InstanceInfo` |
| 2366 """ |
| 2367 params = {} |
| 2368 self.build_list_params(params, instance_ids, 'InstanceId') |
| 2369 return self.get_list('UnmonitorInstances', params, |
2041 [('item', InstanceInfo)], verb='POST') | 2370 [('item', InstanceInfo)], verb='POST') |
2042 | 2371 |
2043 def unmonitor_instance(self, instance_id): | 2372 def unmonitor_instance(self, instance_id): |
2044 """ | 2373 """ |
| 2374 Deprecated Version, maintained for backward compatibility. |
2045 Disable CloudWatch monitoring for the supplied instance. | 2375 Disable CloudWatch monitoring for the supplied instance. |
2046 | 2376 |
2047 :type instance_id: string | 2377 :type instance_id: string |
2048 :param instance_id: The instance id | 2378 :param instance_id: The instance id |
2049 | 2379 |
2050 :rtype: list | 2380 :rtype: list |
2051 :return: A list of :class:`boto.ec2.instanceinfo.InstanceInfo` | 2381 :return: A list of :class:`boto.ec2.instanceinfo.InstanceInfo` |
2052 """ | 2382 """ |
2053 params = {'InstanceId' : instance_id} | 2383 return self.unmonitor_instances([instance_id]) |
2054 return self.get_list('UnmonitorInstances', params, | |
2055 [('item', InstanceInfo)], verb='POST') | |
2056 | 2384 |
2057 # | 2385 # |
2058 # Bundle Windows Instances | 2386 # Bundle Windows Instances |
2059 # | 2387 # |
2060 | 2388 |
2061 def bundle_instance(self, instance_id, | 2389 def bundle_instance(self, instance_id, |
2062 s3_bucket, | 2390 s3_bucket, |
2063 s3_prefix, | 2391 s3_prefix, |
2064 s3_upload_policy): | 2392 s3_upload_policy): |
2065 """ | 2393 """ |
2066 Bundle Windows instance. | 2394 Bundle Windows instance. |
2067 | 2395 |
2068 :type instance_id: string | 2396 :type instance_id: string |
2069 :param instance_id: The instance id | 2397 :param instance_id: The instance id |
2070 | 2398 |
2071 :type s3_bucket: string | 2399 :type s3_bucket: string |
2072 :param s3_bucket: The bucket in which the AMI should be stored. | 2400 :param s3_bucket: The bucket in which the AMI should be stored. |
2073 | 2401 |
2074 :type s3_prefix: string | 2402 :type s3_prefix: string |
2075 :param s3_prefix: The beginning of the file name for the AMI. | 2403 :param s3_prefix: The beginning of the file name for the AMI. |
2076 | 2404 |
2077 :type s3_upload_policy: string | 2405 :type s3_upload_policy: string |
2078 :param s3_upload_policy: Base64 encoded policy that specifies condition | 2406 :param s3_upload_policy: Base64 encoded policy that specifies condition |
2079 and permissions for Amazon EC2 to upload the | 2407 and permissions for Amazon EC2 to upload the |
2080 user's image into Amazon S3. | 2408 user's image into Amazon S3. |
2081 """ | 2409 """ |
2082 | 2410 |
2083 params = {'InstanceId' : instance_id, | 2411 params = {'InstanceId' : instance_id, |
2084 'Storage.S3.Bucket' : s3_bucket, | 2412 'Storage.S3.Bucket' : s3_bucket, |
2085 'Storage.S3.Prefix' : s3_prefix, | 2413 'Storage.S3.Prefix' : s3_prefix, |
2086 'Storage.S3.UploadPolicy' : s3_upload_policy} | 2414 'Storage.S3.UploadPolicy' : s3_upload_policy} |
2087 s3auth = boto.auth.get_auth_handler(None, boto.config, self.provider, ['
s3']) | 2415 s3auth = boto.auth.get_auth_handler(None, boto.config, |
| 2416 self.provider, ['s3']) |
2088 params['Storage.S3.AWSAccessKeyId'] = self.aws_access_key_id | 2417 params['Storage.S3.AWSAccessKeyId'] = self.aws_access_key_id |
2089 signature = s3auth.sign_string(s3_upload_policy) | 2418 signature = s3auth.sign_string(s3_upload_policy) |
2090 params['Storage.S3.UploadPolicySignature'] = signature | 2419 params['Storage.S3.UploadPolicySignature'] = signature |
2091 return self.get_object('BundleInstance', params, BundleInstanceTask, ver
b='POST') | 2420 return self.get_object('BundleInstance', params, |
| 2421 BundleInstanceTask, verb='POST') |
2092 | 2422 |
2093 def get_all_bundle_tasks(self, bundle_ids=None, filters=None): | 2423 def get_all_bundle_tasks(self, bundle_ids=None, filters=None): |
2094 """ | 2424 """ |
2095 Retrieve current bundling tasks. If no bundle id is specified, all | 2425 Retrieve current bundling tasks. If no bundle id is specified, all |
2096 tasks are retrieved. | 2426 tasks are retrieved. |
2097 | 2427 |
2098 :type bundle_ids: list | 2428 :type bundle_ids: list |
2099 :param bundle_ids: A list of strings containing identifiers for | 2429 :param bundle_ids: A list of strings containing identifiers for |
2100 previously created bundling tasks. | 2430 previously created bundling tasks. |
2101 | 2431 |
2102 :type filters: dict | 2432 :type filters: dict |
2103 :param filters: Optional filters that can be used to limit | 2433 :param filters: Optional filters that can be used to limit |
2104 the results returned. Filters are provided | 2434 the results returned. Filters are provided |
2105 in the form of a dictionary consisting of | 2435 in the form of a dictionary consisting of |
2106 filter names as the key and filter values | 2436 filter names as the key and filter values |
2107 as the value. The set of allowable filter | 2437 as the value. The set of allowable filter |
2108 names/values is dependent on the request | 2438 names/values is dependent on the request |
2109 being performed. Check the EC2 API guide | 2439 being performed. Check the EC2 API guide |
2110 for details. | 2440 for details. |
2111 | 2441 |
2112 """ | 2442 """ |
2113 | 2443 |
2114 params = {} | 2444 params = {} |
2115 if bundle_ids: | 2445 if bundle_ids: |
2116 self.build_list_params(params, bundle_ids, 'BundleId') | 2446 self.build_list_params(params, bundle_ids, 'BundleId') |
2117 if filters: | 2447 if filters: |
2118 self.build_filter_params(params, filters) | 2448 self.build_filter_params(params, filters) |
2119 return self.get_list('DescribeBundleTasks', params, | 2449 return self.get_list('DescribeBundleTasks', params, |
2120 [('item', BundleInstanceTask)], verb='POST') | 2450 [('item', BundleInstanceTask)], verb='POST') |
2121 | 2451 |
2122 def cancel_bundle_task(self, bundle_id): | 2452 def cancel_bundle_task(self, bundle_id): |
2123 """ | 2453 """ |
2124 Cancel a previously submitted bundle task | 2454 Cancel a previously submitted bundle task |
2125 | 2455 |
2126 :type bundle_id: string | 2456 :type bundle_id: string |
2127 :param bundle_id: The identifier of the bundle task to cancel. | 2457 :param bundle_id: The identifier of the bundle task to cancel. |
2128 """ | 2458 """ |
2129 | 2459 |
2130 params = {'BundleId' : bundle_id} | 2460 params = {'BundleId' : bundle_id} |
2131 return self.get_object('CancelBundleTask', params, BundleInstanceTask, v
erb='POST') | 2461 return self.get_object('CancelBundleTask', params, |
| 2462 BundleInstanceTask, verb='POST') |
2132 | 2463 |
2133 def get_password_data(self, instance_id): | 2464 def get_password_data(self, instance_id): |
2134 """ | 2465 """ |
2135 Get encrypted administrator password for a Windows instance. | 2466 Get encrypted administrator password for a Windows instance. |
2136 | 2467 |
2137 :type instance_id: string | 2468 :type instance_id: string |
2138 :param instance_id: The identifier of the instance to retrieve the | 2469 :param instance_id: The identifier of the instance to retrieve the |
2139 password for. | 2470 password for. |
2140 """ | 2471 """ |
2141 | 2472 |
2142 params = {'InstanceId' : instance_id} | 2473 params = {'InstanceId' : instance_id} |
2143 rs = self.get_object('GetPasswordData', params, ResultSet, verb='POST') | 2474 rs = self.get_object('GetPasswordData', params, ResultSet, verb='POST') |
2144 return rs.passwordData | 2475 return rs.passwordData |
2145 | 2476 |
2146 # | 2477 # |
2147 # Cluster Placement Groups | 2478 # Cluster Placement Groups |
2148 # | 2479 # |
2149 | 2480 |
2150 def get_all_placement_groups(self, groupnames=None, filters=None): | 2481 def get_all_placement_groups(self, groupnames=None, filters=None): |
2151 """ | 2482 """ |
2152 Get all placement groups associated with your account in a region. | 2483 Get all placement groups associated with your account in a region. |
2153 | 2484 |
2154 :type groupnames: list | 2485 :type groupnames: list |
2155 :param groupnames: A list of the names of placement groups to retrieve. | 2486 :param groupnames: A list of the names of placement groups to retrieve. |
2156 If not provided, all placement groups will be | 2487 If not provided, all placement groups will be |
(...skipping 26 matching lines...) Expand all Loading... |
2183 This will create the placement group within the region you | 2514 This will create the placement group within the region you |
2184 are currently connected to. | 2515 are currently connected to. |
2185 | 2516 |
2186 :type name: string | 2517 :type name: string |
2187 :param name: The name of the new placement group | 2518 :param name: The name of the new placement group |
2188 | 2519 |
2189 :type strategy: string | 2520 :type strategy: string |
2190 :param strategy: The placement strategy of the new placement group. | 2521 :param strategy: The placement strategy of the new placement group. |
2191 Currently, the only acceptable value is "cluster". | 2522 Currently, the only acceptable value is "cluster". |
2192 | 2523 |
2193 :rtype: :class:`boto.ec2.placementgroup.PlacementGroup` | 2524 :rtype: bool |
2194 :return: The newly created :class:`boto.ec2.keypair.KeyPair`. | 2525 :return: True if successful |
2195 """ | 2526 """ |
2196 params = {'GroupName':name, 'Strategy':strategy} | 2527 params = {'GroupName':name, 'Strategy':strategy} |
2197 group = self.get_status('CreatePlacementGroup', params, verb='POST') | 2528 group = self.get_status('CreatePlacementGroup', params, verb='POST') |
2198 return group | 2529 return group |
2199 | 2530 |
2200 def delete_placement_group(self, name): | 2531 def delete_placement_group(self, name): |
2201 """ | 2532 """ |
2202 Delete a placement group from your account. | 2533 Delete a placement group from your account. |
2203 | 2534 |
2204 :type key_name: string | 2535 :type key_name: string |
2205 :param key_name: The name of the keypair to delete | 2536 :param key_name: The name of the keypair to delete |
2206 """ | 2537 """ |
2207 params = {'GroupName':name} | 2538 params = {'GroupName':name} |
2208 return self.get_status('DeletePlacementGroup', params, verb='POST') | 2539 return self.get_status('DeletePlacementGroup', params, verb='POST') |
2209 | 2540 |
2210 # Tag methods | 2541 # Tag methods |
2211 | 2542 |
2212 def build_tag_param_list(self, params, tags): | 2543 def build_tag_param_list(self, params, tags): |
2213 keys = tags.keys() | 2544 keys = tags.keys() |
2214 keys.sort() | 2545 keys.sort() |
2215 i = 1 | 2546 i = 1 |
2216 for key in keys: | 2547 for key in keys: |
2217 value = tags[key] | 2548 value = tags[key] |
2218 params['Tag.%d.Key'%i] = key | 2549 params['Tag.%d.Key'%i] = key |
2219 if value is not None: | 2550 if value is not None: |
2220 params['Tag.%d.Value'%i] = value | 2551 params['Tag.%d.Value'%i] = value |
2221 i += 1 | 2552 i += 1 |
2222 | 2553 |
2223 def get_all_tags(self, tags=None, filters=None): | 2554 def get_all_tags(self, filters=None): |
2224 """ | 2555 """ |
2225 Retrieve all the metadata tags associated with your account. | 2556 Retrieve all the metadata tags associated with your account. |
2226 | 2557 |
2227 :type tags: list | |
2228 :param tags: A list of mumble | |
2229 | |
2230 :type filters: dict | 2558 :type filters: dict |
2231 :param filters: Optional filters that can be used to limit | 2559 :param filters: Optional filters that can be used to limit |
2232 the results returned. Filters are provided | 2560 the results returned. Filters are provided |
2233 in the form of a dictionary consisting of | 2561 in the form of a dictionary consisting of |
2234 filter names as the key and filter values | 2562 filter names as the key and filter values |
2235 as the value. The set of allowable filter | 2563 as the value. The set of allowable filter |
2236 names/values is dependent on the request | 2564 names/values is dependent on the request |
2237 being performed. Check the EC2 API guide | 2565 being performed. Check the EC2 API guide |
2238 for details. | 2566 for details. |
2239 | 2567 |
2240 :rtype: dict | 2568 :rtype: dict |
2241 :return: A dictionary containing metadata tags | 2569 :return: A dictionary containing metadata tags |
2242 """ | 2570 """ |
2243 params = {} | 2571 params = {} |
2244 if tags: | |
2245 self.build_list_params(params, instance_ids, 'InstanceId') | |
2246 if filters: | 2572 if filters: |
2247 self.build_filter_params(params, filters) | 2573 self.build_filter_params(params, filters) |
2248 return self.get_list('DescribeTags', params, [('item', Tag)], verb='POST
') | 2574 return self.get_list('DescribeTags', params, |
| 2575 [('item', Tag)], verb='POST') |
2249 | 2576 |
2250 def create_tags(self, resource_ids, tags): | 2577 def create_tags(self, resource_ids, tags): |
2251 """ | 2578 """ |
2252 Create new metadata tags for the specified resource ids. | 2579 Create new metadata tags for the specified resource ids. |
2253 | 2580 |
2254 :type resource_ids: list | 2581 :type resource_ids: list |
2255 :param resource_ids: List of strings | 2582 :param resource_ids: List of strings |
2256 | 2583 |
2257 :type tags: dict | 2584 :type tags: dict |
2258 :param tags: A dictionary containing the name/value pairs | 2585 :param tags: A dictionary containing the name/value pairs. |
| 2586 If you want to create only a tag name, the |
| 2587 value for that tag should be the empty string |
| 2588 (e.g. ''). |
2259 | 2589 |
2260 """ | 2590 """ |
2261 params = {} | 2591 params = {} |
2262 self.build_list_params(params, resource_ids, 'ResourceId') | 2592 self.build_list_params(params, resource_ids, 'ResourceId') |
2263 self.build_tag_param_list(params, tags) | 2593 self.build_tag_param_list(params, tags) |
2264 return self.get_status('CreateTags', params, verb='POST') | 2594 return self.get_status('CreateTags', params, verb='POST') |
2265 | 2595 |
2266 def delete_tags(self, resource_ids, tags): | 2596 def delete_tags(self, resource_ids, tags): |
2267 """ | 2597 """ |
2268 Delete metadata tags for the specified resource ids. | 2598 Delete metadata tags for the specified resource ids. |
2269 | 2599 |
2270 :type resource_ids: list | 2600 :type resource_ids: list |
2271 :param resource_ids: List of strings | 2601 :param resource_ids: List of strings |
2272 | 2602 |
2273 :type tags: dict or list | 2603 :type tags: dict or list |
2274 :param tags: Either a dictionary containing name/value pairs | 2604 :param tags: Either a dictionary containing name/value pairs |
2275 or a list containing just tag names. | 2605 or a list containing just tag names. |
2276 If you pass in a dictionary, the values must | 2606 If you pass in a dictionary, the values must |
2277 match the actual tag values or the tag will | 2607 match the actual tag values or the tag will |
2278 not be deleted. | 2608 not be deleted. If you pass in a value of None |
| 2609 for the tag value, all tags with that name will |
| 2610 be deleted. |
2279 | 2611 |
2280 """ | 2612 """ |
2281 if isinstance(tags, list): | 2613 if isinstance(tags, list): |
2282 tags = {}.fromkeys(tags, None) | 2614 tags = {}.fromkeys(tags, None) |
2283 params = {} | 2615 params = {} |
2284 self.build_list_params(params, resource_ids, 'ResourceId') | 2616 self.build_list_params(params, resource_ids, 'ResourceId') |
2285 self.build_tag_param_list(params, tags) | 2617 self.build_tag_param_list(params, tags) |
2286 return self.get_status('DeleteTags', params, verb='POST') | 2618 return self.get_status('DeleteTags', params, verb='POST') |
2287 | 2619 |
OLD | NEW |