| 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 import boto | 26 import boto |
| 27 from boto.ec2.ec2object import EC2Object, TaggedEC2Object | 27 from boto.ec2.ec2object import EC2Object, TaggedEC2Object |
| 28 from boto.resultset import ResultSet | 28 from boto.resultset import ResultSet |
| 29 from boto.ec2.address import Address | 29 from boto.ec2.address import Address |
| 30 from boto.ec2.blockdevicemapping import BlockDeviceMapping | 30 from boto.ec2.blockdevicemapping import BlockDeviceMapping |
| 31 from boto.ec2.image import ProductCodes | 31 from boto.ec2.image import ProductCodes |
| 32 import base64 | 32 import base64 |
| 33 | 33 |
| 34 class Reservation(EC2Object): | 34 class Reservation(EC2Object): |
| 35 """ |
| 36 Represents a Reservation response object. |
| 37 |
| 38 :ivar id: The unique ID of the Reservation. |
| 39 :ivar owner_id: The unique ID of the owner of the Reservation. |
| 40 :ivar groups: A list of Group objects representing the security |
| 41 groups associated with launched instances. |
| 42 :ivar instances: A list of Instance objects launched in this |
| 43 Reservation. |
| 44 """ |
| 35 | 45 |
| 36 def __init__(self, connection=None): | 46 def __init__(self, connection=None): |
| 37 EC2Object.__init__(self, connection) | 47 EC2Object.__init__(self, connection) |
| 38 self.id = None | 48 self.id = None |
| 39 self.owner_id = None | 49 self.owner_id = None |
| 40 self.groups = [] | 50 self.groups = [] |
| 41 self.instances = [] | 51 self.instances = [] |
| 42 | 52 |
| 43 def __repr__(self): | 53 def __repr__(self): |
| 44 return 'Reservation:%s' % self.id | 54 return 'Reservation:%s' % self.id |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 96 self.ip_address = None | 106 self.ip_address = None |
| 97 self.requester_id = None | 107 self.requester_id = None |
| 98 self._in_monitoring_element = False | 108 self._in_monitoring_element = False |
| 99 self.persistent = False | 109 self.persistent = False |
| 100 self.root_device_name = None | 110 self.root_device_name = None |
| 101 self.root_device_type = None | 111 self.root_device_type = None |
| 102 self.block_device_mapping = None | 112 self.block_device_mapping = None |
| 103 self.state_reason = None | 113 self.state_reason = None |
| 104 self.group_name = None | 114 self.group_name = None |
| 105 self.client_token = None | 115 self.client_token = None |
| 116 self.groups = [] |
| 106 | 117 |
| 107 def __repr__(self): | 118 def __repr__(self): |
| 108 return 'Instance:%s' % self.id | 119 return 'Instance:%s' % self.id |
| 109 | 120 |
| 110 def startElement(self, name, attrs, connection): | 121 def startElement(self, name, attrs, connection): |
| 111 retval = TaggedEC2Object.startElement(self, name, attrs, connection) | 122 retval = TaggedEC2Object.startElement(self, name, attrs, connection) |
| 112 if retval is not None: | 123 if retval is not None: |
| 113 return retval | 124 return retval |
| 114 if name == 'monitoring': | 125 if name == 'monitoring': |
| 115 self._in_monitoring_element = True | 126 self._in_monitoring_element = True |
| 116 elif name == 'blockDeviceMapping': | 127 elif name == 'blockDeviceMapping': |
| 117 self.block_device_mapping = BlockDeviceMapping() | 128 self.block_device_mapping = BlockDeviceMapping() |
| 118 return self.block_device_mapping | 129 return self.block_device_mapping |
| 119 elif name == 'productCodes': | 130 elif name == 'productCodes': |
| 120 return self.product_codes | 131 return self.product_codes |
| 121 elif name == 'stateReason': | 132 elif name == 'stateReason': |
| 122 self.state_reason = StateReason() | 133 self.state_reason = StateReason() |
| 123 return self.state_reason | 134 return self.state_reason |
| 135 elif name == 'groupSet': |
| 136 self.groups = ResultSet([('item', Group)]) |
| 137 return self.groups |
| 124 return None | 138 return None |
| 125 | 139 |
| 126 def endElement(self, name, value, connection): | 140 def endElement(self, name, value, connection): |
| 127 if name == 'instanceId': | 141 if name == 'instanceId': |
| 128 self.id = value | 142 self.id = value |
| 129 elif name == 'imageId': | 143 elif name == 'imageId': |
| 130 self.image_id = value | 144 self.image_id = value |
| 131 elif name == 'dnsName' or name == 'publicDnsName': | 145 elif name == 'dnsName' or name == 'publicDnsName': |
| 132 self.dns_name = value # backwards compatibility | 146 self.dns_name = value # backwards compatibility |
| 133 self.public_dns_name = value | 147 self.public_dns_name = value |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 222 self._update(i) | 236 self._update(i) |
| 223 elif validate: | 237 elif validate: |
| 224 raise ValueError('%s is not a valid Instance ID' % self.id) | 238 raise ValueError('%s is not a valid Instance ID' % self.id) |
| 225 return self.state | 239 return self.state |
| 226 | 240 |
| 227 def terminate(self): | 241 def terminate(self): |
| 228 """ | 242 """ |
| 229 Terminate the instance | 243 Terminate the instance |
| 230 """ | 244 """ |
| 231 rs = self.connection.terminate_instances([self.id]) | 245 rs = self.connection.terminate_instances([self.id]) |
| 232 self._update(rs[0]) | 246 if len(rs) > 0: |
| 247 self._update(rs[0]) |
| 233 | 248 |
| 234 def stop(self, force=False): | 249 def stop(self, force=False): |
| 235 """ | 250 """ |
| 236 Stop the instance | 251 Stop the instance |
| 237 | 252 |
| 238 :type force: bool | 253 :type force: bool |
| 239 :param force: Forces the instance to stop | 254 :param force: Forces the instance to stop |
| 240 | 255 |
| 241 :rtype: list | 256 :rtype: list |
| 242 :return: A list of the instances stopped | 257 :return: A list of the instances stopped |
| 243 """ | 258 """ |
| 244 rs = self.connection.stop_instances([self.id]) | 259 rs = self.connection.stop_instances([self.id]) |
| 245 self._update(rs[0]) | 260 if len(rs) > 0: |
| 261 self._update(rs[0]) |
| 246 | 262 |
| 247 def start(self): | 263 def start(self): |
| 248 """ | 264 """ |
| 249 Start the instance. | 265 Start the instance. |
| 250 """ | 266 """ |
| 251 rs = self.connection.start_instances([self.id]) | 267 rs = self.connection.start_instances([self.id]) |
| 252 self._update(rs[0]) | 268 if len(rs) > 0: |
| 269 self._update(rs[0]) |
| 253 | 270 |
| 254 def reboot(self): | 271 def reboot(self): |
| 255 return self.connection.reboot_instances([self.id]) | 272 return self.connection.reboot_instances([self.id]) |
| 256 | 273 |
| 257 def get_console_output(self): | 274 def get_console_output(self): |
| 258 """ | 275 """ |
| 259 Retrieves the console output for the instance. | 276 Retrieves the console output for the instance. |
| 260 | 277 |
| 261 :rtype: :class:`boto.ec2.instance.ConsoleOutput` | 278 :rtype: :class:`boto.ec2.instance.ConsoleOutput` |
| 262 :return: The console output as a ConsoleOutput object | 279 :return: The console output as a ConsoleOutput object |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 329 | 346 |
| 330 :rtype: bool | 347 :rtype: bool |
| 331 :return: Whether the operation succeeded or not | 348 :return: Whether the operation succeeded or not |
| 332 """ | 349 """ |
| 333 return self.connection.reset_instance_attribute(self.id, attribute) | 350 return self.connection.reset_instance_attribute(self.id, attribute) |
| 334 | 351 |
| 335 class Group: | 352 class Group: |
| 336 | 353 |
| 337 def __init__(self, parent=None): | 354 def __init__(self, parent=None): |
| 338 self.id = None | 355 self.id = None |
| 356 self.name = None |
| 339 | 357 |
| 340 def startElement(self, name, attrs, connection): | 358 def startElement(self, name, attrs, connection): |
| 341 return None | 359 return None |
| 342 | 360 |
| 343 def endElement(self, name, value, connection): | 361 def endElement(self, name, value, connection): |
| 344 if name == 'groupId': | 362 if name == 'groupId': |
| 345 self.id = value | 363 self.id = value |
| 364 elif name == 'groupName': |
| 365 self.name = value |
| 346 else: | 366 else: |
| 347 setattr(self, name, value) | 367 setattr(self, name, value) |
| 348 | 368 |
| 349 class ConsoleOutput: | 369 class ConsoleOutput: |
| 350 | 370 |
| 351 def __init__(self, parent=None): | 371 def __init__(self, parent=None): |
| 352 self.parent = parent | 372 self.parent = parent |
| 353 self.instance_id = None | 373 self.instance_id = None |
| 354 self.timestamp = None | 374 self.timestamp = None |
| 355 self.comment = None | 375 self.output = None |
| 356 | 376 |
| 357 def startElement(self, name, attrs, connection): | 377 def startElement(self, name, attrs, connection): |
| 358 return None | 378 return None |
| 359 | 379 |
| 360 def endElement(self, name, value, connection): | 380 def endElement(self, name, value, connection): |
| 361 if name == 'instanceId': | 381 if name == 'instanceId': |
| 362 self.instance_id = value | 382 self.instance_id = value |
| 383 elif name == 'timestamp': |
| 384 self.timestamp = value |
| 363 elif name == 'output': | 385 elif name == 'output': |
| 364 self.output = base64.b64decode(value) | 386 self.output = base64.b64decode(value) |
| 365 else: | 387 else: |
| 366 setattr(self, name, value) | 388 setattr(self, name, value) |
| 367 | 389 |
| 368 class InstanceAttribute(dict): | 390 class InstanceAttribute(dict): |
| 369 | 391 |
| 392 ValidValues = ['instanceType', 'kernel', 'ramdisk', 'userData', |
| 393 'disableApiTermination', 'instanceInitiatedShutdownBehavior', |
| 394 'rootDeviceName', 'blockDeviceMapping', 'sourceDestCheck', |
| 395 'groupSet'] |
| 396 |
| 370 def __init__(self, parent=None): | 397 def __init__(self, parent=None): |
| 371 dict.__init__(self) | 398 dict.__init__(self) |
| 399 self.instance_id = None |
| 400 self.request_id = None |
| 372 self._current_value = None | 401 self._current_value = None |
| 373 | 402 |
| 374 def startElement(self, name, attrs, connection): | 403 def startElement(self, name, attrs, connection): |
| 375 return None | 404 if name == 'blockDeviceMapping': |
| 405 self[name] = BlockDeviceMapping() |
| 406 return self[name] |
| 407 elif name == 'groupSet': |
| 408 self[name] = ResultSet([('item', Group)]) |
| 409 return self[name] |
| 410 else: |
| 411 return None |
| 376 | 412 |
| 377 def endElement(self, name, value, connection): | 413 def endElement(self, name, value, connection): |
| 378 if name == 'value': | 414 if name == 'instanceId': |
| 415 self.instance_id = value |
| 416 elif name == 'requestId': |
| 417 self.request_id = value |
| 418 elif name == 'value': |
| 379 self._current_value = value | 419 self._current_value = value |
| 380 else: | 420 elif name in self.ValidValues: |
| 381 self[name] = self._current_value | 421 self[name] = self._current_value |
| 382 | 422 |
| 383 class StateReason(dict): | 423 class StateReason(dict): |
| 384 | 424 |
| 385 def __init__(self, parent=None): | 425 def __init__(self, parent=None): |
| 386 dict.__init__(self) | 426 dict.__init__(self) |
| 387 | 427 |
| 388 def startElement(self, name, attrs, connection): | 428 def startElement(self, name, attrs, connection): |
| 389 return None | 429 return None |
| 390 | 430 |
| 391 def endElement(self, name, value, connection): | 431 def endElement(self, name, value, connection): |
| 392 if name != 'stateReason': | 432 if name != 'stateReason': |
| 393 self[name] = value | 433 self[name] = value |
| 394 | 434 |
| OLD | NEW |