Index: third_party/gsutil/boto/boto/ec2/snapshot.py |
diff --git a/third_party/gsutil/boto/boto/ec2/snapshot.py b/third_party/gsutil/boto/boto/ec2/snapshot.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..d2c4b2b9fdc83d314d2405a6ff5022734a8e3ef0 |
--- /dev/null |
+++ b/third_party/gsutil/boto/boto/ec2/snapshot.py |
@@ -0,0 +1,170 @@ |
+# Copyright (c) 2006-2010 Mitch Garnaat http://garnaat.org/ |
+# Copyright (c) 2010, Eucalyptus Systems, Inc. |
+# |
+# Permission is hereby granted, free of charge, to any person obtaining a |
+# copy of this software and associated documentation files (the |
+# "Software"), to deal in the Software without restriction, including |
+# without limitation the rights to use, copy, modify, merge, publish, dis- |
+# tribute, sublicense, and/or sell copies of the Software, and to permit |
+# persons to whom the Software is furnished to do so, subject to the fol- |
+# lowing conditions: |
+# |
+# The above copyright notice and this permission notice shall be included |
+# in all copies or substantial portions of the Software. |
+# |
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
+# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL- |
+# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT |
+# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, |
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS |
+# IN THE SOFTWARE. |
+ |
+""" |
+Represents an EC2 Elastic Block Store Snapshot |
+""" |
+from boto.ec2.ec2object import TaggedEC2Object |
+from boto.ec2.zone import Zone |
+ |
+class Snapshot(TaggedEC2Object): |
+ |
+ AttrName = 'createVolumePermission' |
+ |
+ def __init__(self, connection=None): |
+ TaggedEC2Object.__init__(self, connection) |
+ self.id = None |
+ self.volume_id = None |
+ self.status = None |
+ self.progress = None |
+ self.start_time = None |
+ self.owner_id = None |
+ self.owner_alias = None |
+ self.volume_size = None |
+ self.description = None |
+ |
+ def __repr__(self): |
+ return 'Snapshot:%s' % self.id |
+ |
+ def endElement(self, name, value, connection): |
+ if name == 'snapshotId': |
+ self.id = value |
+ elif name == 'volumeId': |
+ self.volume_id = value |
+ elif name == 'status': |
+ self.status = value |
+ elif name == 'startTime': |
+ self.start_time = value |
+ elif name == 'ownerId': |
+ self.owner_id = value |
+ elif name == 'ownerAlias': |
+ self.owner_alias = value |
+ elif name == 'volumeSize': |
+ try: |
+ self.volume_size = int(value) |
+ except: |
+ self.volume_size = value |
+ elif name == 'description': |
+ self.description = value |
+ else: |
+ setattr(self, name, value) |
+ |
+ def _update(self, updated): |
+ self.progress = updated.progress |
+ self.status = updated.status |
+ |
+ def update(self, validate=False): |
+ """ |
+ Update the data associated with this snapshot by querying EC2. |
+ |
+ :type validate: bool |
+ :param validate: By default, if EC2 returns no data about the |
+ snapshot the update method returns quietly. If |
+ the validate param is True, however, it will |
+ raise a ValueError exception if no data is |
+ returned from EC2. |
+ """ |
+ rs = self.connection.get_all_snapshots([self.id]) |
+ if len(rs) > 0: |
+ self._update(rs[0]) |
+ elif validate: |
+ raise ValueError('%s is not a valid Snapshot ID' % self.id) |
+ return self.progress |
+ |
+ def delete(self): |
+ return self.connection.delete_snapshot(self.id) |
+ |
+ def get_permissions(self): |
+ attrs = self.connection.get_snapshot_attribute(self.id, self.AttrName) |
+ return attrs.attrs |
+ |
+ def share(self, user_ids=None, groups=None): |
+ return self.connection.modify_snapshot_attribute(self.id, |
+ self.AttrName, |
+ 'add', |
+ user_ids, |
+ groups) |
+ |
+ def unshare(self, user_ids=None, groups=None): |
+ return self.connection.modify_snapshot_attribute(self.id, |
+ self.AttrName, |
+ 'remove', |
+ user_ids, |
+ groups) |
+ |
+ def reset_permissions(self): |
+ return self.connection.reset_snapshot_attribute(self.id, |
+ self.AttrName) |
+ |
+ def create_volume(self, zone, size=None, volume_type=None, iops=None): |
+ """ |
+ Create a new EBS Volume from this Snapshot |
+ |
+ :type zone: string or :class:`boto.ec2.zone.Zone` |
+ :param zone: The availability zone in which the Volume will be created. |
+ |
+ :type size: int |
+ :param size: The size of the new volume, in GiB. (optional). Defaults to |
+ the size of the snapshot. |
+ |
+ :type volume_type: string |
+ :param volume_type: The type of the volume. (optional). Valid |
+ values are: standard | io1. |
+ |
+ :type iops: int |
+ :param iops: The provisioned IOPs you want to associate with |
+ this volume. (optional) |
+ """ |
+ if isinstance(zone, Zone): |
+ zone = zone.name |
+ return self.connection.create_volume(size, zone, self.id, volume_type, iops) |
+ |
+ |
+class SnapshotAttribute: |
+ |
+ def __init__(self, parent=None): |
+ self.snapshot_id = None |
+ self.attrs = {} |
+ |
+ def startElement(self, name, attrs, connection): |
+ return None |
+ |
+ def endElement(self, name, value, connection): |
+ if name == 'createVolumePermission': |
+ self.name = 'create_volume_permission' |
+ elif name == 'group': |
+ if 'groups' in self.attrs: |
+ self.attrs['groups'].append(value) |
+ else: |
+ self.attrs['groups'] = [value] |
+ elif name == 'userId': |
+ if 'user_ids' in self.attrs: |
+ self.attrs['user_ids'].append(value) |
+ else: |
+ self.attrs['user_ids'] = [value] |
+ elif name == 'snapshotId': |
+ self.snapshot_id = value |
+ else: |
+ setattr(self, name, value) |
+ |
+ |
+ |