Repository: libcloud
Updated Branches:
  refs/heads/trunk 659d64cec -> 373059dc5


Consolidate snapshot creation time into created attr


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

Branch: refs/heads/trunk
Commit: ad31155c6ebe238b841dc2aecffe3320e41333c5
Parents: 7898007
Author: Allard Hoeve <[email protected]>
Authored: Tue Mar 3 16:37:38 2015 +0100
Committer: Allard Hoeve <[email protected]>
Committed: Wed Mar 4 20:40:28 2015 +0100

----------------------------------------------------------------------
 CHANGES.rst                             |  7 +++++++
 docs/upgrade_notes.rst                  |  9 +++++++++
 libcloud/compute/base.py                | 17 ++++++++++++++++-
 libcloud/compute/drivers/ec2.py         |  4 +++-
 libcloud/compute/drivers/gce.py         | 13 ++++++++++---
 libcloud/compute/drivers/openstack.py   |  9 ++++++++-
 libcloud/compute/drivers/rackspace.py   |  8 +++++++-
 libcloud/test/compute/test_ec2.py       |  3 +++
 libcloud/test/compute/test_openstack.py |  6 ++++++
 libcloud/test/compute/test_rackspace.py |  1 +
 10 files changed, 70 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/ad31155c/CHANGES.rst
----------------------------------------------------------------------
diff --git a/CHANGES.rst b/CHANGES.rst
index 96b3971..4725542 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -15,6 +15,13 @@ General
 Compute
 ~~~~~~~
 
+- VolumeSnapshots now have a `created` attribute that is a `datetime`
+  field showing the creation datetime of the snapshot. The field in
+  VolumeSnapshot.extra containing the original string is maintained, so
+  this is a backwards-compatible change.
+  (GITHUB-473)
+  [Allard Hoeve]
+
 - Improve GCE create_node, make sure ex_get_disktype function
   (GITHUB-448)
   [Markos Gogoulos]

http://git-wip-us.apache.org/repos/asf/libcloud/blob/ad31155c/docs/upgrade_notes.rst
----------------------------------------------------------------------
diff --git a/docs/upgrade_notes.rst b/docs/upgrade_notes.rst
index dd6c52b..bb33d61 100644
--- a/docs/upgrade_notes.rst
+++ b/docs/upgrade_notes.rst
@@ -5,6 +5,15 @@ This page describes how to upgrade from a previous version to 
a new version
 which contains backward incompatible or semi-incompatible changes and how to
 preserve the old behavior when this is possible.
 
+Development
+-----------
+
+* VolumeSnapshots now have a `created` attribute that is a `datetime`
+  field showing the creation datetime of the snapshot. The field in
+  VolumeSnapshot.extra containing the original string is maintained, so
+  this is a backwards-compatible change.
+
+
 Libcloud 0.16.0
 ---------------
 

http://git-wip-us.apache.org/repos/asf/libcloud/blob/ad31155c/libcloud/compute/base.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/base.py b/libcloud/compute/base.py
index 8387104..b211686 100644
--- a/libcloud/compute/base.py
+++ b/libcloud/compute/base.py
@@ -545,23 +545,38 @@ class VolumeSnapshot(object):
     """
     A base VolumeSnapshot class to derive from.
     """
-    def __init__(self, id, driver, size=None, extra=None):
+    id = None
+    driver = None
+    size = None
+    extra = None
+    created = None
+
+    def __init__(self, id, driver, size=None, extra=None, created=None):
         """
         VolumeSnapshot constructor.
 
         :param      id: Snapshot ID.
         :type       id: ``str``
 
+        :param      driver: The driver that represents a connection to the
+                            provider
+        :type       driver: `NodeDriver`
+
         :param      size: A snapshot size in GB.
         :type       size: ``int``
 
         :param      extra: Provider depends parameters for snapshot.
         :type       extra: ``dict``
+
+        :param      created: A datetime object that represents when the
+                             snapshot was created
+        :type       created: ``datetime.datetime``
         """
         self.id = id
         self.driver = driver
         self.size = size
         self.extra = extra or {}
+        self.created = created
 
     def destroy(self):
         """

http://git-wip-us.apache.org/repos/asf/libcloud/blob/ad31155c/libcloud/compute/drivers/ec2.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/drivers/ec2.py b/libcloud/compute/drivers/ec2.py
index fd7c98c..f30e7ae 100644
--- a/libcloud/compute/drivers/ec2.py
+++ b/libcloud/compute/drivers/ec2.py
@@ -4690,6 +4690,8 @@ class BaseEC2NodeDriver(NodeDriver):
                           namespace=NAMESPACE)
         size = findtext(element=element, xpath='volumeSize',
                         namespace=NAMESPACE)
+        created = parse_date(findtext(element=element, xpath='startTime',
+                             namespace=NAMESPACE))
 
         # Get our tags
         tags = self._get_resource_tags(element)
@@ -4707,7 +4709,7 @@ class BaseEC2NodeDriver(NodeDriver):
         extra['name'] = name
 
         return VolumeSnapshot(snapId, size=int(size),
-                              driver=self, extra=extra)
+                              driver=self, extra=extra, created=created)
 
     def _to_key_pairs(self, elems):
         key_pairs = [self._to_key_pair(elem=elem) for elem in elems]

http://git-wip-us.apache.org/repos/asf/libcloud/blob/ad31155c/libcloud/compute/drivers/gce.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/drivers/gce.py b/libcloud/compute/drivers/gce.py
index 9eabd98..666f1c1 100644
--- a/libcloud/compute/drivers/gce.py
+++ b/libcloud/compute/drivers/gce.py
@@ -33,6 +33,7 @@ from libcloud.compute.base import NodeSize, StorageVolume, 
VolumeSnapshot
 from libcloud.compute.base import UuidMixin
 from libcloud.compute.providers import Provider
 from libcloud.compute.types import NodeState
+from libcloud.utils.iso8601 import parse_date
 
 API_VERSION = 'v1'
 DEFAULT_TASK_COMPLETION_TIMEOUT = 180
@@ -485,10 +486,11 @@ class GCERegion(UuidMixin):
 
 
 class GCESnapshot(VolumeSnapshot):
-    def __init__(self, id, name, size, status, driver, extra=None):
+    def __init__(self, id, name, size, status, driver, extra=None,
+                 created=None):
         self.name = name
         self.status = status
-        super(GCESnapshot, self).__init__(id, driver, size, extra)
+        super(GCESnapshot, self).__init__(id, driver, size, extra, created)
 
 
 class GCETargetHttpProxy(UuidMixin):
@@ -5203,10 +5205,15 @@ n
             lic_objs = self._licenses_from_urls(licenses=snapshot['licenses'])
             extra['licenses'] = lic_objs
 
+        try:
+            created = parse_date(snapshot.get('creationTimestamp'))
+        except ValueError:
+            created = None
+
         return GCESnapshot(id=snapshot['id'], name=snapshot['name'],
                            size=snapshot['diskSizeGb'],
                            status=snapshot.get('status'), driver=self,
-                           extra=extra)
+                           extra=extra, created=created)
 
     def _to_storage_volume(self, volume):
         """

http://git-wip-us.apache.org/repos/asf/libcloud/blob/ad31155c/libcloud/compute/drivers/openstack.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/drivers/openstack.py 
b/libcloud/compute/drivers/openstack.py
index da8c05b..69ec7d1 100644
--- a/libcloud/compute/drivers/openstack.py
+++ b/libcloud/compute/drivers/openstack.py
@@ -15,6 +15,7 @@
 """
 OpenStack driver
 """
+from libcloud.utils.iso8601 import parse_date
 
 try:
     import simplejson as json
@@ -2066,8 +2067,14 @@ class OpenStack_1_1_NodeDriver(OpenStackNodeDriver):
                  'description': description,
                  'status': status}
 
+        try:
+            created_dt = parse_date(created_at)
+        except ValueError:
+            created_dt = None
+
         snapshot = VolumeSnapshot(id=data['id'], driver=self,
-                                  size=data['size'], extra=extra)
+                                  size=data['size'], extra=extra,
+                                  created=created_dt)
         return snapshot
 
     def _to_size(self, api_flavor, price=None, bandwidth=None):

http://git-wip-us.apache.org/repos/asf/libcloud/blob/ad31155c/libcloud/compute/drivers/rackspace.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/drivers/rackspace.py 
b/libcloud/compute/drivers/rackspace.py
index 57559c8..8085220 100644
--- a/libcloud/compute/drivers/rackspace.py
+++ b/libcloud/compute/drivers/rackspace.py
@@ -22,6 +22,7 @@ from libcloud.compute.drivers.openstack import 
OpenStack_1_1_Connection,\
     OpenStack_1_1_NodeDriver
 
 from libcloud.common.rackspace import AUTH_URL
+from libcloud.utils.iso8601 import parse_date
 
 
 ENDPOINT_ARGS_MAP = {
@@ -215,9 +216,14 @@ class RackspaceNodeDriver(OpenStack_1_1_NodeDriver):
                  'description': api_node['displayDescription'],
                  'status': api_node['status']}
 
+        try:
+            created_td = parse_date(api_node['createdAt'])
+        except ValueError:
+            created_td = None
+
         snapshot = VolumeSnapshot(id=api_node['id'], driver=self,
                                   size=api_node['size'],
-                                  extra=extra)
+                                  extra=extra, created=created_td)
         return snapshot
 
     def _ex_connection_class_kwargs(self):

http://git-wip-us.apache.org/repos/asf/libcloud/blob/ad31155c/libcloud/test/compute/test_ec2.py
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/test_ec2.py 
b/libcloud/test/compute/test_ec2.py
index 1b79781..247f9e4 100644
--- a/libcloud/test/compute/test_ec2.py
+++ b/libcloud/test/compute/test_ec2.py
@@ -18,6 +18,7 @@ from __future__ import with_statement
 import os
 import sys
 from datetime import datetime
+from libcloud.utils.iso8601 import UTC
 
 from libcloud.utils.py3 import httplib
 
@@ -824,6 +825,8 @@ class EC2Tests(LibcloudTestCase, TestCaseMixin):
         self.assertEqual('Test snapshot', snap.extra['name'])
         self.assertEqual(vol.id, snap.extra['volume_id'])
         self.assertEqual('pending', snap.extra['state'])
+        # 2013-08-15T16:22:30.000Z
+        self.assertEqual(datetime(2013, 8, 15, 16, 22, 30, tzinfo=UTC), 
snap.created)
 
     def test_list_snapshots(self):
         snaps = self.driver.list_snapshots()

http://git-wip-us.apache.org/repos/asf/libcloud/blob/ad31155c/libcloud/test/compute/test_openstack.py
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/test_openstack.py 
b/libcloud/test/compute/test_openstack.py
index e8b4cb0..b69effc 100644
--- a/libcloud/test/compute/test_openstack.py
+++ b/libcloud/test/compute/test_openstack.py
@@ -19,6 +19,7 @@ import os
 import sys
 import unittest
 import datetime
+from libcloud.utils.iso8601 import UTC
 
 try:
     import simplejson as json
@@ -1396,8 +1397,13 @@ class OpenStack_1_1_Tests(unittest.TestCase, 
TestCaseMixin):
 
         snapshots = self.driver.ex_list_snapshots()
         self.assertEqual(len(snapshots), 3)
+        self.assertEqual(snapshots[0].created, datetime.datetime(2012, 2, 29, 
3, 50, 7, tzinfo=UTC))
+        self.assertEqual(snapshots[0].extra['created'], "2012-02-29T03:50:07Z")
         self.assertEqual(snapshots[0].extra['name'], 'snap-001')
 
+        # invalid date is parsed as None
+        assert snapshots[2].created is None
+
     def test_list_volume_snapshots(self):
         volume = self.driver.list_volumes()[0]
 

http://git-wip-us.apache.org/repos/asf/libcloud/blob/ad31155c/libcloud/test/compute/test_rackspace.py
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/test_rackspace.py 
b/libcloud/test/compute/test_rackspace.py
index d42e668..e24b873 100644
--- a/libcloud/test/compute/test_rackspace.py
+++ b/libcloud/test/compute/test_rackspace.py
@@ -117,6 +117,7 @@ class RackspaceNovaLonMockHttp(RackspaceNovaMockHttp):
                 httplib.responses[httplib.OK])
 
 
+# Does not derive from TestCase because it should not be used by setup.py test
 class BaseRackspaceNovaTestCase(object):
     conn_classes = (RackspaceNovaMockHttp, RackspaceNovaMockHttp)
     auth_url = 'https://auth.api.example.com'

Reply via email to