You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@libcloud.apache.org by er...@apache.org on 2015/02/02 19:10:34 UTC

libcloud git commit: Add node stop/start support

Repository: libcloud
Updated Branches:
  refs/heads/trunk 5072fc0de -> 5395ccf83


Add node stop/start support

Closes #442

Signed-off-by: Eric Johnson <er...@google.com>


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

Branch: refs/heads/trunk
Commit: 5395ccf8333092a4180804ce38625a3ef7a39753
Parents: 5072fc0
Author: Eric Johnson <er...@google.com>
Authored: Fri Jan 30 22:29:54 2015 +0000
Committer: Eric Johnson <er...@google.com>
Committed: Mon Feb 2 18:10:06 2015 +0000

----------------------------------------------------------------------
 CHANGES.rst                                     |  4 ++
 libcloud/compute/drivers/gce.py                 | 30 ++++++++++++
 ..._us_central1_a_instances_node_name_stop.json | 15 ++++++
 ...es_us_central1_a_instances_stopped_node.json | 48 ++++++++++++++++++++
 ...central1_a_instances_stopped_node_start.json | 15 ++++++
 ..._central1_a_instances_stopped_node_stop.json | 15 ++++++
 ...ntral1_a_operations_operation_startnode.json | 15 ++++++
 ...entral1_a_operations_operation_stopnode.json | 15 ++++++
 libcloud/test/compute/test_gce.py               | 39 ++++++++++++++++
 9 files changed, 196 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/5395ccf8/CHANGES.rst
----------------------------------------------------------------------
diff --git a/CHANGES.rst b/CHANGES.rst
index 991f790..5ac315d 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -16,6 +16,10 @@ General
 Compute
 ~~~~~~~
 
+- GCE driver updated to include ex_stop_node() and ex_start_node() methods
+  (GITHUB-442)
+  [Eric Johnson]
+
 - GCE driver now raises ResourceNotFoundError when the specified image is
   not found in any image project. Previously, this would return None but now
   raises the not-found exception instead. This fixes a bug where returning

http://git-wip-us.apache.org/repos/asf/libcloud/blob/5395ccf8/libcloud/compute/drivers/gce.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/drivers/gce.py b/libcloud/compute/drivers/gce.py
index 1778818..1f29601 100644
--- a/libcloud/compute/drivers/gce.py
+++ b/libcloud/compute/drivers/gce.py
@@ -3447,6 +3447,36 @@ n
         self.connection.async_request(request, method='DELETE')
         return True
 
+    def ex_start_node(self, node):
+        """
+        Start a node that is stopped and in TERMINATED state.
+
+        :param  node: Node object to start
+        :type   node: :class:`Node`
+
+        :return:  True if successful
+        :rtype:   ``bool``
+        """
+        request = '/zones/%s/instances/%s/start' % (node.extra['zone'].name,
+                                                    node.name)
+        self.connection.async_request(request, method='POST')
+        return True
+
+    def ex_stop_node(self, node):
+        """
+        Stop a running node.
+
+        :param  node: Node object to stop
+        :type   node: :class:`Node`
+
+        :return:  True if successful
+        :rtype:   ``bool``
+        """
+        request = '/zones/%s/instances/%s/stop' % (node.extra['zone'].name,
+                                                   node.name)
+        self.connection.async_request(request, method='POST')
+        return True
+
     def destroy_node(self, node, destroy_boot_disk=False):
         """
         Destroy a node.

http://git-wip-us.apache.org/repos/asf/libcloud/blob/5395ccf8/libcloud/test/compute/fixtures/gce/zones_us_central1_a_instances_node_name_stop.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/gce/zones_us_central1_a_instances_node_name_stop.json b/libcloud/test/compute/fixtures/gce/zones_us_central1_a_instances_node_name_stop.json
new file mode 100644
index 0000000..e68e06a
--- /dev/null
+++ b/libcloud/test/compute/fixtures/gce/zones_us_central1_a_instances_node_name_stop.json
@@ -0,0 +1,15 @@
+{
+ "kind": "compute#operation",
+ "id": "18431811683007150988",
+ "name": "operation-stopnode",
+ "zone": "https://www.googleapis.com/compute/v1/projects/project_name/zones/us-central1-a",
+ "operationType": "stop",
+ "targetLink": "https://www.googleapis.com/compute/v1/projects/project_name/zones/us-central1-a/instances/node-name",
+ "targetId": "12335588484913203363",
+ "status": "PENDING",
+ "user": "erjohnso@google.com",
+ "progress": 0,
+ "insertTime": "2015-01-30T06:55:11.503-08:00",
+ "startTime": "2015-01-30T06:55:11.847-08:00",
+ "selfLink": "https://www.googleapis.com/compute/v1/projects/project_name/zones/us-central1-a/operations/operation-stopnode"
+}

http://git-wip-us.apache.org/repos/asf/libcloud/blob/5395ccf8/libcloud/test/compute/fixtures/gce/zones_us_central1_a_instances_stopped_node.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/gce/zones_us_central1_a_instances_stopped_node.json b/libcloud/test/compute/fixtures/gce/zones_us_central1_a_instances_stopped_node.json
new file mode 100644
index 0000000..a47c75f
--- /dev/null
+++ b/libcloud/test/compute/fixtures/gce/zones_us_central1_a_instances_stopped_node.json
@@ -0,0 +1,48 @@
+{
+  "canIpForward": false,
+  "creationTimestamp": "2013-12-13T10:45:23.351-08:00",
+  "disks": [
+    {
+      "boot": true,
+      "deviceName": "persistent-disk-0",
+      "index": 0,
+      "kind": "compute#attachedDisk",
+      "mode": "READ_WRITE",
+      "source": "https://www.googleapis.com/compute/v1/projects/project_name/zones/us-central1-a/disks/lcdisk",
+      "type": "PERSISTENT"
+    }
+  ],
+  "id": "4006034190819017667",
+  "kind": "compute#instance",
+  "machineType": "https://www.googleapis.com/compute/v1/projects/project_name/zones/us-central1-a/machineTypes/n1-standard-1",
+  "metadata": {
+    "fingerprint": "42WmSpB8rSM=",
+    "kind": "compute#metadata"
+  },
+  "name": "stopped-node",
+  "networkInterfaces": [
+    {
+      "accessConfigs": [
+        {
+          "kind": "compute#accessConfig",
+          "name": "External NAT",
+          "natIP": "23.236.58.15",
+          "type": "ONE_TO_ONE_NAT"
+        }
+      ],
+      "name": "nic0",
+      "network": "https://www.googleapis.com/compute/v1/projects/project_name/global/networks/default",
+      "networkIP": "10.240.72.75"
+    }
+  ],
+  "scheduling": {
+    "automaticRestart": true,
+    "onHostMaintenance": "MIGRATE"
+  },
+  "selfLink": "https://www.googleapis.com/compute/v1/projects/project_name/zones/us-central1-a/instances/stopped-node",
+  "status": "TERMINATED",
+  "tags": {
+    "fingerprint": "42WmSpB8rSM="
+  },
+  "zone": "https://www.googleapis.com/compute/v1/projects/project_name/zones/us-central1-a"
+}

http://git-wip-us.apache.org/repos/asf/libcloud/blob/5395ccf8/libcloud/test/compute/fixtures/gce/zones_us_central1_a_instances_stopped_node_start.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/gce/zones_us_central1_a_instances_stopped_node_start.json b/libcloud/test/compute/fixtures/gce/zones_us_central1_a_instances_stopped_node_start.json
new file mode 100644
index 0000000..d531709
--- /dev/null
+++ b/libcloud/test/compute/fixtures/gce/zones_us_central1_a_instances_stopped_node_start.json
@@ -0,0 +1,15 @@
+{
+ "kind": "compute#operation",
+ "id": "18431811683007150988",
+ "name": "operation-startnode",
+ "zone": "https://www.googleapis.com/compute/v1/projects/project_name/zones/us-central1-a",
+ "operationType": "start",
+ "targetLink": "https://www.googleapis.com/compute/v1/projects/project_name/zones/us-central1-a/instances/stopped-node",
+ "targetId": "12335588484913203363",
+ "status": "PENDING",
+ "user": "erjohnso@google.com",
+ "progress": 0,
+ "insertTime": "2015-01-30T06:55:11.503-08:00",
+ "startTime": "2015-01-30T06:55:11.847-08:00",
+ "selfLink": "https://www.googleapis.com/compute/v1/projects/project_name/zones/us-central1-a/operations/operation-startnode"
+}

http://git-wip-us.apache.org/repos/asf/libcloud/blob/5395ccf8/libcloud/test/compute/fixtures/gce/zones_us_central1_a_instances_stopped_node_stop.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/gce/zones_us_central1_a_instances_stopped_node_stop.json b/libcloud/test/compute/fixtures/gce/zones_us_central1_a_instances_stopped_node_stop.json
new file mode 100644
index 0000000..5febcc6
--- /dev/null
+++ b/libcloud/test/compute/fixtures/gce/zones_us_central1_a_instances_stopped_node_stop.json
@@ -0,0 +1,15 @@
+{
+ "kind": "compute#operation",
+ "id": "18431811683007150988",
+ "name": "operation-stopnode",
+ "zone": "https://www.googleapis.com/compute/v1/projects/project_name/zones/us-central1-a",
+ "operationType": "stop",
+ "targetLink": "https://www.googleapis.com/compute/v1/projects/project_name/zones/us-central1-a/instances/stopped-node",
+ "targetId": "12335588484913203363",
+ "status": "PENDING",
+ "user": "erjohnso@google.com",
+ "progress": 0,
+ "insertTime": "2015-01-30T06:55:11.503-08:00",
+ "startTime": "2015-01-30T06:55:11.847-08:00",
+ "selfLink": "https://www.googleapis.com/compute/v1/projects/project_name/zones/us-central1-a/operations/operation-stopnode"
+}

http://git-wip-us.apache.org/repos/asf/libcloud/blob/5395ccf8/libcloud/test/compute/fixtures/gce/zones_us_central1_a_operations_operation_startnode.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/gce/zones_us_central1_a_operations_operation_startnode.json b/libcloud/test/compute/fixtures/gce/zones_us_central1_a_operations_operation_startnode.json
new file mode 100644
index 0000000..68276b2
--- /dev/null
+++ b/libcloud/test/compute/fixtures/gce/zones_us_central1_a_operations_operation_startnode.json
@@ -0,0 +1,15 @@
+{
+ "kind": "compute#operation",
+ "id": "18431811683007150988",
+ "name": "operation-startnode",
+ "zone": "https://www.googleapis.com/compute/v1/projects/project_name/zones/us-central1-a",
+ "operationType": "start",
+ "targetLink": "https://www.googleapis.com/compute/v1/projects/project_name/zones/us-central1-a/instances/stopped-node",
+ "targetId": "12335588484913203363",
+ "status": "DONE",
+ "user": "erjohnso@google.com",
+ "progress": 100,
+ "insertTime": "2015-01-30T06:55:11.503-08:00",
+ "startTime": "2015-01-30T06:55:11.847-08:00",
+ "selfLink": "https://www.googleapis.com/compute/v1/projects/project_name/zones/us-central1-a/operations/operation-startnode"
+}

http://git-wip-us.apache.org/repos/asf/libcloud/blob/5395ccf8/libcloud/test/compute/fixtures/gce/zones_us_central1_a_operations_operation_stopnode.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/gce/zones_us_central1_a_operations_operation_stopnode.json b/libcloud/test/compute/fixtures/gce/zones_us_central1_a_operations_operation_stopnode.json
new file mode 100644
index 0000000..30275b6
--- /dev/null
+++ b/libcloud/test/compute/fixtures/gce/zones_us_central1_a_operations_operation_stopnode.json
@@ -0,0 +1,15 @@
+{
+ "kind": "compute#operation",
+ "id": "18431811683007150988",
+ "name": "operation-stopnode",
+ "zone": "https://www.googleapis.com/compute/v1/projects/project_name/zones/us-central1-a",
+ "operationType": "stop",
+ "targetLink": "https://www.googleapis.com/compute/v1/projects/project_name/zones/us-central1-a/instances/node-name",
+ "targetId": "12335588484913203363",
+ "status": "DONE",
+ "user": "erjohnso@google.com",
+ "progress": 100,
+ "insertTime": "2015-01-30T06:55:11.503-08:00",
+ "startTime": "2015-01-30T06:55:11.847-08:00",
+ "selfLink": "https://www.googleapis.com/compute/v1/projects/project_name/zones/us-central1-a/operations/operation-stopnode"
+}

http://git-wip-us.apache.org/repos/asf/libcloud/blob/5395ccf8/libcloud/test/compute/test_gce.py
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/test_gce.py b/libcloud/test/compute/test_gce.py
index 35ec80f..3b2c34e 100644
--- a/libcloud/test/compute/test_gce.py
+++ b/libcloud/test/compute/test_gce.py
@@ -443,6 +443,21 @@ class GCENodeDriverTest(LibcloudTestCase, TestCaseMixin):
         self.assertEqual(network.name, network_name)
         self.assertEqual(network.cidr, cidr)
 
+    def test_ex_node_start(self):
+        zone = 'us-central1-a'
+        node = self.driver.ex_get_node('stopped-node', zone)
+        self.assertTrue(self.driver.ex_start_node(node))
+
+    def test_ex_node_stop(self):
+        zone = 'us-central1-a'
+        node = self.driver.ex_get_node('node-name', zone)
+        self.assertTrue(self.driver.ex_stop_node(node))
+
+        # try and stop a stopped node (should work)
+        zone = 'us-central1-a'
+        node = self.driver.ex_get_node('stopped-node', zone)
+        self.assertTrue(self.driver.ex_stop_node(node))
+
     def test_create_node_req(self):
         image = self.driver.ex_get_image('debian-7')
         size = self.driver.ex_get_size('n1-standard-1')
@@ -1314,6 +1329,30 @@ class GCEMockHttp(MockHttpTestCase):
             body = self.fixtures.load('setUsageExportBucket_post.json')
         return (httplib.OK, body, self.json_hdr, httplib.responses[httplib.OK])
 
+    def _zones_us_central1_a_operations_operation_startnode(self, method, url, body, header):
+        body = self.fixtures.load('zones_us_central1_a_operations_operation_startnode.json')
+        return (httplib.OK, body, self.json_hdr, httplib.responses[httplib.OK])
+
+    def _zones_us_central1_a_instances_stopped_node_start(self, method, url, body, header):
+        body = self.fixtures.load('zones_us_central1_a_instances_stopped_node_start.json')
+        return (httplib.OK, body, self.json_hdr, httplib.responses[httplib.OK])
+
+    def _zones_us_central1_a_instances_stopped_node_stop(self, method, url, body, header):
+        body = self.fixtures.load('zones_us_central1_a_instances_stopped_node_stop.json')
+        return (httplib.OK, body, self.json_hdr, httplib.responses[httplib.OK])
+
+    def _zones_us_central1_a_instances_stopped_node(self, method, url, body, headers):
+        body = self.fixtures.load('zones_us_central1_a_instances_stopped_node.json')
+        return (httplib.OK, body, self.json_hdr, httplib.responses[httplib.OK])
+
+    def _zones_us_central1_a_operations_operation_stopnode(self, method, url, body, headers):
+        body = self.fixtures.load('zones_us_central1_a_operations_operation_stopnode.json')
+        return (httplib.OK, body, self.json_hdr, httplib.responses[httplib.OK])
+
+    def _zones_us_central1_a_instances_node_name_stop(self, method, url, body, headers):
+        body = self.fixtures.load('zones_us_central1_a_instances_node_name_stop.json')
+        return (httplib.OK, body, self.json_hdr, httplib.responses[httplib.OK])
+
     def _zones_us_central1_a_instances_node_name_setMetadata(self, method, url, body, headers):
         body = self.fixtures.load('zones_us_central1_a_instances_node_name_setMetadata_post.json')
         return (httplib.OK, body, self.json_hdr, httplib.responses[httplib.OK])