You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@libcloud.apache.org by an...@apache.org on 2016/10/24 11:00:23 UTC
[1/2] libcloud git commit: LIBCLOUD-861: Implement Volume Snapshot
Operations for Digital Ocean
Repository: libcloud
Updated Branches:
refs/heads/trunk e62eb2bcc -> 50cba636e
LIBCLOUD-861: Implement Volume Snapshot Operations for Digital Ocean
* Add methods for creating, listing and deleting volume snapshots to the
Digital Ocean driver.
* Add the corresponding tests and their fixtures.
Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo
Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/8c5a4aff
Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/8c5a4aff
Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/8c5a4aff
Branch: refs/heads/trunk
Commit: 8c5a4aff28c1f0eb7b7229558f2e88b83691df73
Parents: e4e56e9
Author: Fahri Cihan Demirci <fe...@users.noreply.github.com>
Authored: Sat Oct 15 05:17:41 2016 -0400
Committer: Fahri Cihan Demirci <fe...@users.noreply.github.com>
Committed: Sun Oct 16 00:08:15 2016 -0400
----------------------------------------------------------------------
libcloud/compute/drivers/digitalocean.py | 54 +++++++++++++++++++-
.../digitalocean_v2/create_volume_snapshot.json | 14 +++++
.../digitalocean_v2/list_volume_snapshots.json | 44 ++++++++++++++++
libcloud/test/compute/test_digitalocean_v2.py | 40 +++++++++++++++
4 files changed, 151 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/libcloud/blob/8c5a4aff/libcloud/compute/drivers/digitalocean.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/drivers/digitalocean.py b/libcloud/compute/drivers/digitalocean.py
index b195bae..7a676b6 100644
--- a/libcloud/compute/drivers/digitalocean.py
+++ b/libcloud/compute/drivers/digitalocean.py
@@ -27,7 +27,7 @@ from libcloud.common.types import InvalidCredsError
from libcloud.compute.types import Provider, NodeState
from libcloud.compute.base import NodeImage, NodeSize, NodeLocation, KeyPair
from libcloud.compute.base import Node, NodeDriver
-from libcloud.compute.base import StorageVolume
+from libcloud.compute.base import StorageVolume, VolumeSnapshot
__all__ = [
'DigitalOceanNodeDriver',
@@ -398,6 +398,49 @@ class DigitalOcean_v2_NodeDriver(DigitalOcean_v2_BaseDriver,
return all([r.status == httplib.ACCEPTED for r in responses])
+ def create_volume_snapshot(self, volume, name):
+ """
+ Create a new volume snapshot.
+
+ :param volume: Volume to create a snapshot for
+ :type volume: class:`StorageVolume`
+
+ :return: The newly created volume snapshot.
+ :rtype: :class:`VolumeSnapshot`
+ """
+ attr = {'name': name}
+ res = self.connection.request('/v2/volumes/%s/snapshots' % (
+ volume.id), data=json.dumps(attr), method='POST')
+ data = res.object['snapshot']
+ return self._to_volume_snapshot(data=data)
+
+ def list_volume_snapshots(self, volume):
+ """
+ List snapshots for a volume.
+
+ :param volume: Volume to list snapshots for
+ :type volume: class:`StorageVolume`
+
+ :return: List of volume snapshots.
+ :rtype: ``list`` of :class: `StorageVolume`
+ """
+ data = self._paginated_request('/v2/volumes/%s/snapshots' %
+ (volume.id), 'snapshots')
+ return list(map(self._to_volume_snapshot, data))
+
+ def delete_volume_snapshot(self, snapshot):
+ """
+ Delete a volume snapshot
+
+ :param snapshot: volume snapshot to delete
+ :type snapshot: class:`VolumeSnapshot`
+
+ :rtype: ``bool``
+ """
+ res = self.connection.request('v2/snapshots/%s' % (snapshot.id),
+ method='DELETE')
+ return res.status == httplib.NO_CONTENT
+
def _to_node(self, data):
extra_keys = ['memory', 'vcpus', 'disk', 'region', 'image',
'size_slug', 'locked', 'created_at', 'networks',
@@ -467,3 +510,12 @@ class DigitalOcean_v2_NodeDriver(DigitalOcean_v2_BaseDriver,
private_key=None,
driver=self,
extra=extra)
+
+ def _to_volume_snapshot(self, data):
+ extra = {'created_at': data['created_at'],
+ 'resource_id': data['resource_id'],
+ 'regions': data['regions'],
+ 'min_disk_size': data['min_disk_size']}
+ return VolumeSnapshot(id=data['id'], name=data['name'],
+ size=data['size_gigabytes'],
+ driver=self, extra=extra)
http://git-wip-us.apache.org/repos/asf/libcloud/blob/8c5a4aff/libcloud/test/compute/fixtures/digitalocean_v2/create_volume_snapshot.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/digitalocean_v2/create_volume_snapshot.json b/libcloud/test/compute/fixtures/digitalocean_v2/create_volume_snapshot.json
new file mode 100644
index 0000000..ce4a691
--- /dev/null
+++ b/libcloud/test/compute/fixtures/digitalocean_v2/create_volume_snapshot.json
@@ -0,0 +1,14 @@
+{
+ "snapshot": {
+ "id": "c0def940-9324-11e6-9a56-000f533176b1",
+ "name": "test-snapshot",
+ "regions": [
+ "nyc1"
+ ],
+ "created_at": "2016-10-15T22:14:34Z",
+ "resource_id": "8371d4fe-92b0-11e6-9a56-000f533176b1",
+ "resource_type": "volume",
+ "min_disk_size": 1,
+ "size_gigabytes": 0
+ }
+}
http://git-wip-us.apache.org/repos/asf/libcloud/blob/8c5a4aff/libcloud/test/compute/fixtures/digitalocean_v2/list_volume_snapshots.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/digitalocean_v2/list_volume_snapshots.json b/libcloud/test/compute/fixtures/digitalocean_v2/list_volume_snapshots.json
new file mode 100644
index 0000000..21ede3a
--- /dev/null
+++ b/libcloud/test/compute/fixtures/digitalocean_v2/list_volume_snapshots.json
@@ -0,0 +1,44 @@
+{
+ "snapshots": [
+ {
+ "id": "c0def940-9324-11e6-9a56-000f533176b1",
+ "name": "test-snapshot",
+ "regions": [
+ "nyc1"
+ ],
+ "created_at": "2016-10-15T22:14:34Z",
+ "resource_id": "8371d4fe-92b0-11e6-9a56-000f533176b1",
+ "resource_type": "volume",
+ "min_disk_size": 1,
+ "size_gigabytes": 0
+ },
+ {
+ "id": "c2036724-9343-11e6-aef4-000f53315a41",
+ "name": "test-snapshot-2",
+ "regions": [
+ "nyc1"
+ ],
+ "created_at": "2016-10-16T01:56:30Z",
+ "resource_id": "8371d4fe-92b0-11e6-9a56-000f533176b1",
+ "resource_type": "volume",
+ "min_disk_size": 1,
+ "size_gigabytes": 0
+ },
+ {
+ "id": "d347e033-9343-11e6-9a56-000f533176b1",
+ "name": "test-snapshot-3",
+ "regions": [
+ "nyc1"
+ ],
+ "created_at": "2016-10-16T01:56:59Z",
+ "resource_id": "8371d4fe-92b0-11e6-9a56-000f533176b1",
+ "resource_type": "volume",
+ "min_disk_size": 1,
+ "size_gigabytes": 0
+ }
+ ],
+ "links": {},
+ "meta": {
+ "total": 3
+ }
+}
http://git-wip-us.apache.org/repos/asf/libcloud/blob/8c5a4aff/libcloud/test/compute/test_digitalocean_v2.py
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/test_digitalocean_v2.py b/libcloud/test/compute/test_digitalocean_v2.py
index a215e81..c7a916d 100644
--- a/libcloud/test/compute/test_digitalocean_v2.py
+++ b/libcloud/test/compute/test_digitalocean_v2.py
@@ -236,6 +236,30 @@ class DigitalOcean_v2_Tests(LibcloudTestCase):
resp = self.driver.destroy_volume(volume)
self.assertTrue(resp)
+ def test_list_volume_snapshots(self):
+ volume = self.driver.list_volumes()[0]
+ snapshots = self.driver.list_volume_snapshots(volume)
+ self.assertEqual(len(snapshots), 3)
+ snapshot1, snapshot2, snapshot3 = snapshots
+ self.assertEqual(snapshot1.id, "c0def940-9324-11e6-9a56-000f533176b1")
+ self.assertEqual(snapshot2.id, "c2036724-9343-11e6-aef4-000f53315a41")
+ self.assertEqual(snapshot3.id, "d347e033-9343-11e6-9a56-000f533176b1")
+
+ def test_create_volume_snapshot(self):
+ volume = self.driver.list_volumes()[0]
+ DigitalOceanMockHttp.type = 'CREATE'
+ snapshot = self.driver.create_volume_snapshot(volume, 'test-snapshot')
+ self.assertEqual(snapshot.id, "c0def940-9324-11e6-9a56-000f533176b1")
+ self.assertEqual(snapshot.name, 'test-snapshot')
+ self.assertEqual(volume.driver, self.driver)
+
+ def test_delete_volume_snapshot(self):
+ volume = self.driver.list_volumes()[0]
+ snapshot = self.driver.list_volume_snapshots(volume)[0]
+ DigitalOceanMockHttp.type = 'DELETE'
+ result = self.driver.delete_volume_snapshot(snapshot)
+ self.assertTrue(result)
+
class DigitalOceanMockHttp(MockHttpTestCase):
fixtures = ComputeFileFixtures('digitalocean_v2')
@@ -353,5 +377,21 @@ class DigitalOceanMockHttp(MockHttpTestCase):
return (httplib.NO_CONTENT, None, {},
httplib.responses[httplib.NO_CONTENT])
+ def _v2_volumes_62766883_2c28_11e6_b8e6_000f53306ae1_snapshots_CREATE(
+ self, method, url, body, headers):
+ body = self.fixtures.load('create_volume_snapshot.json')
+ return (httplib.CREATED, body, {}, httplib.responses[httplib.CREATED])
+
+ def _v2_volumes_62766883_2c28_11e6_b8e6_000f53306ae1_snapshots(
+ self, method, url, body, headers):
+ body = self.fixtures.load('list_volume_snapshots.json')
+ return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+ def _v2_snapshots_c0def940_9324_11e6_9a56_000f533176b1_DELETE(
+ self, method, url, body, headers):
+ return (httplib.NO_CONTENT, None, {},
+ httplib.responses[httplib.NO_CONTENT])
+
+
if __name__ == '__main__':
sys.exit(unittest.main())
[2/2] libcloud git commit: Merge branch 'github-909' into trunk
Closes #909
Posted by an...@apache.org.
Merge branch 'github-909' into trunk
Closes #909
Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo
Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/50cba636
Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/50cba636
Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/50cba636
Branch: refs/heads/trunk
Commit: 50cba636ede0bf412bdfcefa74a8f606bb097f9c
Parents: e62eb2b 8c5a4af
Author: Anthony Shaw <an...@apache.org>
Authored: Mon Oct 24 12:00:08 2016 +0100
Committer: Anthony Shaw <an...@apache.org>
Committed: Mon Oct 24 12:00:08 2016 +0100
----------------------------------------------------------------------
libcloud/compute/drivers/digitalocean.py | 54 +++++++++++++++++++-
.../digitalocean_v2/create_volume_snapshot.json | 14 +++++
.../digitalocean_v2/list_volume_snapshots.json | 44 ++++++++++++++++
libcloud/test/compute/test_digitalocean_v2.py | 40 +++++++++++++++
4 files changed, 151 insertions(+), 1 deletion(-)
----------------------------------------------------------------------