You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@libcloud.apache.org by qu...@apache.org on 2018/01/29 18:18:20 UTC
[2/3] libcloud git commit: Adds rebuild and resize commands for
DigitalOcean
Adds rebuild and resize commands for DigitalOcean
Implement the following DigitalOcean APIs as driver-specific extensions,
* https://developers.digitalocean.com/documentation/v2/#rebuild-a-droplet
* https://developers.digitalocean.com/documentation/v2/#resize-a-droplet
Signed-off-by: Quentin Pradet <qu...@apache.org>
Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo
Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/8fadb9c7
Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/8fadb9c7
Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/8fadb9c7
Branch: refs/heads/trunk
Commit: 8fadb9c7c9b65993b84d12b63dc6ab8e1277ea24
Parents: 889a58a
Author: Adam Wight <aw...@wikimedia.org>
Authored: Fri Jan 26 13:02:41 2018 -0500
Committer: Quentin Pradet <qu...@apache.org>
Committed: Mon Jan 29 22:17:55 2018 +0400
----------------------------------------------------------------------
libcloud/compute/drivers/digitalocean.py | 34 ++++++++++++++++++++
.../digitalocean_v2/ex_rebuild_node.json | 12 +++++++
.../digitalocean_v2/ex_resize_node.json | 12 +++++++
libcloud/test/compute/test_digitalocean_v2.py | 25 ++++++++++++++
4 files changed, 83 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/libcloud/blob/8fadb9c7/libcloud/compute/drivers/digitalocean.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/drivers/digitalocean.py b/libcloud/compute/drivers/digitalocean.py
index c8acdf0..5815955 100644
--- a/libcloud/compute/drivers/digitalocean.py
+++ b/libcloud/compute/drivers/digitalocean.py
@@ -280,6 +280,40 @@ class DigitalOcean_v2_NodeDriver(DigitalOcean_v2_BaseDriver,
data=json.dumps(attr), method='POST')
return res.status == httplib.CREATED
+ def ex_rebuild_node(self, node):
+ """
+ Destroy and rebuild the node using its base image.
+
+ :param node: Node to rebuild
+ :type node: :class:`Node`
+
+ :return True if the operation began successfully
+ :rtype ``bool``
+ """
+ attr = {'type': 'rebuild', 'image': node.extra['image']['id']}
+ res = self.connection.request('/v2/droplets/%s/actions' % (node.id),
+ data=json.dumps(attr), method='POST')
+ return res.status == httplib.CREATED
+
+ def ex_resize_node(self, node, size):
+ """
+ Resize the node to a different machine size. Note that some resize
+ operations are reversible, and others are irreversible.
+
+ :param node: Node to rebuild
+ :type node: :class:`Node`
+
+ :param size: New size for this machine
+ :type node: :class:`NodeSize`
+
+ :return True if the operation began successfully
+ :rtype ``bool``
+ """
+ attr = {'type': 'resize', 'size': size.name}
+ res = self.connection.request('/v2/droplets/%s/actions' % (node.id),
+ data=json.dumps(attr), method='POST')
+ return res.status == httplib.CREATED
+
def create_key_pair(self, name, public_key=''):
"""
Create a new SSH key.
http://git-wip-us.apache.org/repos/asf/libcloud/blob/8fadb9c7/libcloud/test/compute/fixtures/digitalocean_v2/ex_rebuild_node.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/digitalocean_v2/ex_rebuild_node.json b/libcloud/test/compute/fixtures/digitalocean_v2/ex_rebuild_node.json
new file mode 100644
index 0000000..154ddce
--- /dev/null
+++ b/libcloud/test/compute/fixtures/digitalocean_v2/ex_rebuild_node.json
@@ -0,0 +1,12 @@
+{
+ "action": {
+ "id": 36804758,
+ "status": "in-progress",
+ "type": "rebuild",
+ "started_at": "2014-11-14T16:31:19Z",
+ "completed_at": null,
+ "resource_id": 3164450,
+ "resource_type": "droplet",
+ "region_slug": "nyc3"
+ }
+}
http://git-wip-us.apache.org/repos/asf/libcloud/blob/8fadb9c7/libcloud/test/compute/fixtures/digitalocean_v2/ex_resize_node.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/digitalocean_v2/ex_resize_node.json b/libcloud/test/compute/fixtures/digitalocean_v2/ex_resize_node.json
new file mode 100644
index 0000000..94f5f0c
--- /dev/null
+++ b/libcloud/test/compute/fixtures/digitalocean_v2/ex_resize_node.json
@@ -0,0 +1,12 @@
+{
+ "action": {
+ "id": 36804758,
+ "status": "in-progress",
+ "type": "resize",
+ "started_at": "2014-11-14T16:31:19Z",
+ "completed_at": null,
+ "resource_id": 3164450,
+ "resource_type": "droplet",
+ "region_slug": "nyc3"
+ }
+}
http://git-wip-us.apache.org/repos/asf/libcloud/blob/8fadb9c7/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 c0065e7..1b049f9 100644
--- a/libcloud/test/compute/test_digitalocean_v2.py
+++ b/libcloud/test/compute/test_digitalocean_v2.py
@@ -155,6 +155,19 @@ class DigitalOcean_v2_Tests(LibcloudTestCase):
result = self.driver.ex_hard_reboot(node)
self.assertTrue(result)
+ def test_ex_rebuild_node_success(self):
+ node = self.driver.list_nodes()[0]
+ DigitalOceanMockHttp.type = 'REBUILD'
+ result = self.driver.ex_rebuild_node(node)
+ self.assertTrue(result)
+
+ def test_ex_resize_node_success(self):
+ node = self.driver.list_nodes()[0]
+ size = self.driver.list_sizes()[0]
+ DigitalOceanMockHttp.type = 'RESIZE'
+ result = self.driver.ex_resize_node(node, size)
+ self.assertTrue(result)
+
def test_destroy_node_success(self):
node = self.driver.list_nodes()[0]
DigitalOceanMockHttp.type = 'DESTROY'
@@ -362,6 +375,18 @@ class DigitalOceanMockHttp(MockHttp):
body = self.fixtures.load('ex_hard_reboot.json')
return (httplib.CREATED, body, {}, httplib.responses[httplib.OK])
+ def _v2_droplets_3164444_actions_REBUILD(self, method, url,
+ body, headers):
+ # ex_rebuild_node
+ body = self.fixtures.load('ex_rebuild_node.json')
+ return (httplib.CREATED, body, {}, httplib.responses[httplib.OK])
+
+ def _v2_droplets_3164444_actions_RESIZE(self, method, url,
+ body, headers):
+ # ex_resize_node
+ body = self.fixtures.load('ex_resize_node.json')
+ return (httplib.CREATED, body, {}, httplib.responses[httplib.OK])
+
def _v2_account_keys(self, method, url, body, headers):
body = self.fixtures.load('list_key_pairs.json')
return (httplib.OK, body, {}, httplib.responses[httplib.OK])