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)

Reply via email to