Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(133)

Unified Diff: third_party/gsutil/boto/boto/ec2/volume.py

Issue 12042069: Scripts to download files from google storage based on sha1 sums (Closed) Base URL: https://chromium.googlesource.com/chromium/tools/depot_tools.git@master
Patch Set: Review fixes, updated gsutil Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/gsutil/boto/boto/ec2/volume.py
diff --git a/third_party/gsutil/boto/boto/ec2/volume.py b/third_party/gsutil/boto/boto/ec2/volume.py
new file mode 100644
index 0000000000000000000000000000000000000000..bc5befc7a5dc694ba38725784b341644609ecd81
--- /dev/null
+++ b/third_party/gsutil/boto/boto/ec2/volume.py
@@ -0,0 +1,293 @@
+# Copyright (c) 2006-2012 Mitch Garnaat http://garnaat.org/
+# Copyright (c) 2010, Eucalyptus Systems, Inc.
+# Copyright (c) 2012 Amazon.com, Inc. or its affiliates. All Rights Reserved
+#
+# 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 Storage Volume
+"""
+from boto.resultset import ResultSet
+from boto.ec2.tag import Tag
+from boto.ec2.ec2object import TaggedEC2Object
+
+
+class Volume(TaggedEC2Object):
+ """
+ Represents an EBS volume.
+
+ :ivar id: The unique ID of the volume.
+ :ivar create_time: The timestamp of when the volume was created.
+ :ivar status: The status of the volume.
+ :ivar size: The size (in GB) of the volume.
+ :ivar snapshot_id: The ID of the snapshot this volume was created
+ from, if applicable.
+ :ivar attach_data: An AttachmentSet object.
+ :ivar zone: The availability zone this volume is in.
+ :ivar type: The type of volume (standard or consistent-iops)
+ :ivar iops: If this volume is of type consistent-iops, this is
+ the number of IOPS provisioned (10-300).
+ """
+
+ def __init__(self, connection=None):
+ TaggedEC2Object.__init__(self, connection)
+ self.id = None
+ self.create_time = None
+ self.status = None
+ self.size = None
+ self.snapshot_id = None
+ self.attach_data = None
+ self.zone = None
+ self.type = None
+ self.iops = None
+
+ def __repr__(self):
+ return 'Volume:%s' % self.id
+
+ def startElement(self, name, attrs, connection):
+ retval = TaggedEC2Object.startElement(self, name, attrs, connection)
+ if retval is not None:
+ return retval
+ if name == 'attachmentSet':
+ self.attach_data = AttachmentSet()
+ return self.attach_data
+ elif name == 'tagSet':
+ self.tags = ResultSet([('item', Tag)])
+ return self.tags
+ else:
+ return None
+
+ def endElement(self, name, value, connection):
+ if name == 'volumeId':
+ self.id = value
+ elif name == 'createTime':
+ self.create_time = value
+ elif name == 'status':
+ if value != '':
+ self.status = value
+ elif name == 'size':
+ self.size = int(value)
+ elif name == 'snapshotId':
+ self.snapshot_id = value
+ elif name == 'availabilityZone':
+ self.zone = value
+ elif name == 'volumeType':
+ self.type = value
+ elif name == 'iops':
+ self.iops = int(value)
+ else:
+ setattr(self, name, value)
+
+ def _update(self, updated):
+ self.__dict__.update(updated.__dict__)
+
+ def update(self, validate=False):
+ """
+ Update the data associated with this volume by querying EC2.
+
+ :type validate: bool
+ :param validate: By default, if EC2 returns no data about the
+ volume 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.
+ """
+ # Check the resultset since Eucalyptus ignores the volumeId param
+ unfiltered_rs = self.connection.get_all_volumes([self.id])
+ rs = [x for x in unfiltered_rs if x.id == self.id]
+ if len(rs) > 0:
+ self._update(rs[0])
+ elif validate:
+ raise ValueError('%s is not a valid Volume ID' % self.id)
+ return self.status
+
+ def delete(self):
+ """
+ Delete this EBS volume.
+
+ :rtype: bool
+ :return: True if successful
+ """
+ return self.connection.delete_volume(self.id)
+
+ def attach(self, instance_id, device):
+ """
+ Attach this EBS volume to an EC2 instance.
+
+ :type instance_id: str
+ :param instance_id: The ID of the EC2 instance to which it will
+ be attached.
+
+ :type device: str
+ :param device: The device on the instance through which the
+ volume will be exposed (e.g. /dev/sdh)
+
+ :rtype: bool
+ :return: True if successful
+ """
+ return self.connection.attach_volume(self.id, instance_id, device)
+
+ def detach(self, force=False):
+ """
+ Detach this EBS volume from an EC2 instance.
+
+ :type force: bool
+ :param force: Forces detachment if the previous detachment
+ attempt did not occur cleanly. This option can lead to
+ data loss or a corrupted file system. Use this option only
+ as a last resort to detach a volume from a failed
+ instance. The instance will not have an opportunity to
+ flush file system caches nor file system meta data. If you
+ use this option, you must perform file system check and
+ repair procedures.
+
+ :rtype: bool
+ :return: True if successful
+ """
+ instance_id = None
+ if self.attach_data:
+ instance_id = self.attach_data.instance_id
+ device = None
+ if self.attach_data:
+ device = self.attach_data.device
+ return self.connection.detach_volume(self.id, instance_id,
+ device, force)
+
+ def create_snapshot(self, description=None):
+ """
+ Create a snapshot of this EBS Volume.
+
+ :type description: str
+ :param description: A description of the snapshot.
+ Limited to 256 characters.
+
+ :rtype: :class:`boto.ec2.snapshot.Snapshot`
+ :return: The created Snapshot object
+ """
+ return self.connection.create_snapshot(self.id, description)
+
+ def volume_state(self):
+ """
+ Returns the state of the volume. Same value as the status attribute.
+ """
+ return self.status
+
+ def attachment_state(self):
+ """
+ Get the attachment state.
+ """
+ state = None
+ if self.attach_data:
+ state = self.attach_data.status
+ return state
+
+ def snapshots(self, owner=None, restorable_by=None):
+ """
+ Get all snapshots related to this volume. Note that this requires
+ that all available snapshots for the account be retrieved from EC2
+ first and then the list is filtered client-side to contain only
+ those for this volume.
+
+ :type owner: str
+ :param owner: If present, only the snapshots owned by the
+ specified user will be returned. Valid values are:
+
+ * self
+ * amazon
+ * AWS Account ID
+
+ :type restorable_by: str
+ :param restorable_by: If present, only the snapshots that
+ are restorable by the specified account id will be returned.
+
+ :rtype: list of L{boto.ec2.snapshot.Snapshot}
+ :return: The requested Snapshot objects
+
+ """
+ rs = self.connection.get_all_snapshots(owner=owner,
+ restorable_by=restorable_by)
+ mine = []
+ for snap in rs:
+ if snap.volume_id == self.id:
+ mine.append(snap)
+ return mine
+
+
+class AttachmentSet(object):
+ """
+ Represents an EBS attachmentset.
+
+ :ivar id: The unique ID of the volume.
+ :ivar instance_id: The unique ID of the attached instance
+ :ivar status: The status of the attachment
+ :ivar attach_time: Attached since
+ :ivar device: The device the instance has mapped
+ """
+
+ def __init__(self):
+ self.id = None
+ self.instance_id = None
+ self.status = None
+ self.attach_time = None
+ self.device = None
+
+ def __repr__(self):
+ return 'AttachmentSet:%s' % self.id
+
+ def startElement(self, name, attrs, connection):
+ pass
+
+ def endElement(self, name, value, connection):
+ if name == 'volumeId':
+ self.id = value
+ elif name == 'instanceId':
+ self.instance_id = value
+ elif name == 'status':
+ self.status = value
+ elif name == 'attachTime':
+ self.attach_time = value
+ elif name == 'device':
+ self.device = value
+ else:
+ setattr(self, name, value)
+
+
+class VolumeAttribute:
+
+ def __init__(self, parent=None):
+ self.id = None
+ self._key_name = None
+ self.attrs = {}
+
+ def startElement(self, name, attrs, connection):
+ if name == 'autoEnableIO':
+ self._key_name = name
+ return None
+
+ def endElement(self, name, value, connection):
+ if name == 'value':
+ if value.lower() == 'true':
+ self.attrs[self._key_name] = True
+ else:
+ self.attrs[self._key_name] = False
+ elif name == 'volumeId':
+ self.id = value
+ else:
+ setattr(self, name, value)

Powered by Google App Engine
This is Rietveld 408576698