Issue LIBCLOUD-480: Add additional attributes to the "extra" dictionary of the VolumeSnapshot object in the EC2 driver.
Also modify create_volume_snapshot method to correctly handle "name" argument. Previous, "name" argument was used as a snapshot description, now it's used as a Tag with a key "Name". Signed-off-by: Tomaz Muraus <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/6c32efed Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/6c32efed Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/6c32efed Branch: refs/heads/trunk Commit: 6c32efed2cef9b69cbe22fd6d56a672a422e93dc Parents: 810e197 Author: Chris DeRamus <[email protected]> Authored: Sun Dec 29 07:36:49 2013 -0500 Committer: Tomaz Muraus <[email protected]> Committed: Sun Dec 29 15:57:41 2013 +0100 ---------------------------------------------------------------------- libcloud/compute/drivers/ec2.py | 62 ++++++++++++++++---- .../compute/fixtures/ec2/describe_snapshots.xml | 4 ++ libcloud/test/compute/test_ec2.py | 7 ++- 3 files changed, 57 insertions(+), 16 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/libcloud/blob/6c32efed/libcloud/compute/drivers/ec2.py ---------------------------------------------------------------------- diff --git a/libcloud/compute/drivers/ec2.py b/libcloud/compute/drivers/ec2.py index 571f494..2011826 100644 --- a/libcloud/compute/drivers/ec2.py +++ b/libcloud/compute/drivers/ec2.py @@ -940,21 +940,52 @@ class BaseEC2NodeDriver(NodeDriver): fixxpath(xpath='snapshotSet/item', namespace=NAMESPACE)) ] - def _to_snapshot(self, element): + def _to_snapshot(self, element, name=None): snapId = findtext(element=element, xpath='snapshotId', namespace=NAMESPACE) - volId = findtext(element=element, xpath='volumeId', - namespace=NAMESPACE) size = findtext(element=element, xpath='volumeSize', namespace=NAMESPACE) - state = findtext(element=element, xpath='status', - namespace=NAMESPACE) - description = findtext(element=element, xpath='description', - namespace=NAMESPACE) - return VolumeSnapshot(snapId, size=int(size), driver=self, - extra={'volume_id': volId, - 'description': description, - 'state': state}) + + # Get our tags + tags = self._get_resource_tags(element) + + # If name was not passed into the method then + # fall back then use the snapshot id + name = name if name else tags.get('Name', snapId) + + # Build our extra attributes map + extra_attributes_map = { + 'volume_id': { + 'xpath': 'volumeId', + 'transform_func': str + }, + 'state': { + 'xpath': 'status', + 'transform_func': str + }, + 'description': { + 'xpath': 'description', + 'transform_func': str + }, + 'progress': { + 'xpath': 'progress', + 'transform_func': str + }, + 'start_time': { + 'xpath': 'startTime', + 'transform_func': parse_date + } + } + + # Get our extra dictionary + extra = self._get_extra_dict(element, extra_attributes_map) + + # Add tags and name to the extra dict + extra['tags'] = tags + extra['name'] = name + + return VolumeSnapshot(snapId, size=int(size), + driver=self, extra=extra) def _to_networks(self, response): return [self._to_network(el) for el in response.findall( @@ -1257,7 +1288,7 @@ class BaseEC2NodeDriver(NodeDriver): :param volume: Instance of ``StorageVolume`` :type volume: ``StorageVolume`` - :param name: Description for snapshot + :param name: Name of snapshot :type name: ``str`` :rtype: :class:`VolumeSnapshot` @@ -1266,12 +1297,17 @@ class BaseEC2NodeDriver(NodeDriver): 'Action': 'CreateSnapshot', 'VolumeId': volume.id, } + if name: params.update({ 'Description': name, }) response = self.connection.request(self.path, params=params).object - snapshot = self._to_snapshot(response) + snapshot = self._to_snapshot(response, name) + + if name: + self.ex_create_tags(snapshot, {'Name': name}) + return snapshot def list_volume_snapshots(self, snapshot): http://git-wip-us.apache.org/repos/asf/libcloud/blob/6c32efed/libcloud/test/compute/fixtures/ec2/describe_snapshots.xml ---------------------------------------------------------------------- diff --git a/libcloud/test/compute/fixtures/ec2/describe_snapshots.xml b/libcloud/test/compute/fixtures/ec2/describe_snapshots.xml index 52f7076..b884c79 100644 --- a/libcloud/test/compute/fixtures/ec2/describe_snapshots.xml +++ b/libcloud/test/compute/fixtures/ec2/describe_snapshots.xml @@ -30,6 +30,10 @@ <description>Weekly backup</description> <tagSet> <item> + <key>Name</key> + <value>DB Backup 1</value> + </item> + <item> <key>Key2</key> <value>db_backup</value> </item> http://git-wip-us.apache.org/repos/asf/libcloud/blob/6c32efed/libcloud/test/compute/test_ec2.py ---------------------------------------------------------------------- diff --git a/libcloud/test/compute/test_ec2.py b/libcloud/test/compute/test_ec2.py index aeb1ddb..81ac6bd 100644 --- a/libcloud/test/compute/test_ec2.py +++ b/libcloud/test/compute/test_ec2.py @@ -692,11 +692,11 @@ class EC2Tests(LibcloudTestCase, TestCaseMixin): def test_create_volume_snapshot(self): vol = StorageVolume(id='vol-4282672b', name='test', size=10, driver=self.driver) - snap = self.driver.create_volume_snapshot(vol, 'Test description') - + snap = self.driver.create_volume_snapshot( + vol, 'Test snapshot') self.assertEqual('snap-a7cb2hd9', snap.id) self.assertEqual(vol.size, snap.size) - self.assertEqual('Test description', snap.extra['description']) + self.assertEqual('Test snapshot', snap.extra['name']) self.assertEqual(vol.id, snap.extra['volume_id']) self.assertEqual('pending', snap.extra['state']) @@ -714,6 +714,7 @@ class EC2Tests(LibcloudTestCase, TestCaseMixin): self.assertEqual('vol-b5a2c1v9', snaps[1].extra['volume_id']) self.assertEqual(15, snaps[1].size) self.assertEqual('Weekly backup', snaps[1].extra['description']) + self.assertEqual('DB Backup 1', snaps[1].extra['name']) def test_destroy_snapshot(self): snap = VolumeSnapshot(id='snap-428abd35', size=10, driver=self.driver)
