Additional functions for the EBS example driver

Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo
Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/b3ac5d36
Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/b3ac5d36
Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/b3ac5d36

Branch: refs/heads/trunk
Commit: b3ac5d36963c81d3550a950aab1528889d1baed0
Parents: 37f8b47
Author: Anthony Shaw <anthony.p.s...@gmail.com>
Authored: Tue Nov 10 14:07:50 2015 +1100
Committer: Anthony Shaw <anthony.p.s...@gmail.com>
Committed: Tue Nov 10 14:07:50 2015 +1100

----------------------------------------------------------------------
 libcloud/backup/drivers/ebs.py | 63 ++++++++++++++++++++++++++++---------
 1 file changed, 49 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/b3ac5d36/libcloud/backup/drivers/ebs.py
----------------------------------------------------------------------
diff --git a/libcloud/backup/drivers/ebs.py b/libcloud/backup/drivers/ebs.py
index dbd2d4c..ea8f80e 100644
--- a/libcloud/backup/drivers/ebs.py
+++ b/libcloud/backup/drivers/ebs.py
@@ -17,10 +17,9 @@ __all__ = [
     'EBSBackupDriver'
 ]
 
-from datetime import datetime
 
 from libcloud.utils.xml import findtext, findall
-
+from libcloud.utils.iso8601 import parse_date
 from libcloud.backup.base import BackupDriver, BackupTargetRecoveryPoint,\
     BackupTargetJob, BackupTarget
 from libcloud.backup.types import BackupTargetType, BackupTargetJobStatusType
@@ -114,10 +113,16 @@ class EBSBackupDriver(BackupDriver):
 
         :rtype: Instance of :class:`BackupTarget`
         """
-        return self.create_target(name=node.name,
-                                  address=node.public_ips[0],
-                                  type=BackupTargetType.VOLUME,
-                                  extra=None)
+        # Get the first EBS volume.
+        device_mapping = node.extra['block_device_mapping']
+        if device_mapping is not None:
+            return self.create_target(
+                name=node.name,
+                address=device_mapping['ebs'][0]['volume_id'],
+                type=BackupTargetType.VOLUME,
+                extra=None)
+        else:
+            raise RuntimeError("Node does not have any block devices")
 
     def create_target_from_container(self, container,
                                      type=BackupTargetType.OBJECT,
@@ -280,11 +285,12 @@ class EBSBackupDriver(BackupDriver):
         :rtype: Instance of :class:`BackupTargetJob`
         """
         params = {
-            'Action': 'DescribeSnapshots',
+            'Action': 'CreateSnapshot',
             'VolumeId': target.extra['volume-id']
         }
         data = self.connection.request(ROOT, params=params).object
-        return self._to_jobs(data)[0]
+        xpath = 'CreateSnapshotResponse'
+        return self._to_job(findall(element=data, xpath=xpath, 
namespace=NS)[0])
 
     def resume_target_job(self, target, job):
         """
@@ -299,7 +305,7 @@ class EBSBackupDriver(BackupDriver):
         :rtype: ``bool``
         """
         raise NotImplementedError(
-            'resume_target_job not implemented for this driver')
+            'resume_target_job not supported for this driver')
 
     def suspend_target_job(self, target, job):
         """
@@ -314,7 +320,7 @@ class EBSBackupDriver(BackupDriver):
         :rtype: ``bool``
         """
         raise NotImplementedError(
-            'suspend_target_job not implemented for this driver')
+            'suspend_target_job not supported for this driver')
 
     def cancel_target_job(self, target, job):
         """
@@ -329,7 +335,7 @@ class EBSBackupDriver(BackupDriver):
         :rtype: ``bool``
         """
         raise NotImplementedError(
-            'cancel_target_job not implemented for this driver')
+            'cancel_target_job not supported for this driver')
 
     def _to_recovery_points(self, data, target):
         xpath = 'DescribeSnapshotsResponse/snapshotSet/item'
@@ -338,15 +344,17 @@ class EBSBackupDriver(BackupDriver):
 
     def _to_recovery_point(self, el, target):
         id = findtext(element=el, xpath='snapshotId', namespace=NS)
-        date = datetime.strptime(
-            findtext(element=el, xpath='startTime', namespace=NS),
-            'YYYY-MM-DDTHH:MM:SS.SSSZ')
+        date = parse_date(
+            findtext(element=el, xpath='startTime', namespace=NS))
+        tags = self._get_resource_tags(el)
         point = BackupTargetRecoveryPoint(
             id=id,
             date=date,
             target=target,
             driver=self.connection.driver,
             extra={
+                'snapshot-id': id,
+                'tags': tags
             },
         )
         return point
@@ -384,3 +392,30 @@ class EBSBackupDriver(BackupDriver):
                 "volume-id": volume_id
             }
         )
+
+    def _get_resource_tags(self, element):
+        """
+        Parse tags from the provided element and return a dictionary with
+        key/value pairs.
+
+        :rtype: ``dict``
+        """
+        tags = {}
+
+        # Get our tag set by parsing the element
+        tag_set = findall(element=element,
+                          xpath='tagSet/item',
+                          namespace=NS)
+
+        for tag in tag_set:
+            key = findtext(element=tag,
+                           xpath='key',
+                           namespace=NS)
+
+            value = findtext(element=tag,
+                             xpath='value',
+                             namespace=NS)
+
+            tags[key] = value
+
+        return tags

Reply via email to