You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@libcloud.apache.org by to...@apache.org on 2012/04/27 00:01:09 UTC

svn commit: r1331124 - in /libcloud/trunk: CHANGES libcloud/compute/drivers/openstack.py test/compute/test_openstack.py

Author: tomaz
Date: Thu Apr 26 22:01:08 2012
New Revision: 1331124

URL: http://svn.apache.org/viewvc?rev=1331124&view=rev
Log:
Add ex_rescue and ex_unrescue method to OpenStack 1.1 driver. This patch has
been submitted by Shawn Smith and is part of LIBCLOUD-193.

Modified:
    libcloud/trunk/CHANGES
    libcloud/trunk/libcloud/compute/drivers/openstack.py
    libcloud/trunk/test/compute/test_openstack.py

Modified: libcloud/trunk/CHANGES
URL: http://svn.apache.org/viewvc/libcloud/trunk/CHANGES?rev=1331124&r1=1331123&r2=1331124&view=diff
==============================================================================
--- libcloud/trunk/CHANGES (original)
+++ libcloud/trunk/CHANGES Thu Apr 26 22:01:08 2012
@@ -65,6 +65,9 @@ Changes with Apache Libcloud in developm
       is not specified when calling deploy_node. ; LIBCLOUD-182
       [Tomaz Muraus]
 
+    - Add ex_rescue and ex_unrescue method to OpenStack 1.1 driver.
+      [Shawn Smith] 
+
   *) Storage
 
     - Large object upload support for CloudFiles driver

Modified: libcloud/trunk/libcloud/compute/drivers/openstack.py
URL: http://svn.apache.org/viewvc/libcloud/trunk/libcloud/compute/drivers/openstack.py?rev=1331124&r1=1331123&r2=1331124&view=diff
==============================================================================
--- libcloud/trunk/libcloud/compute/drivers/openstack.py (original)
+++ libcloud/trunk/libcloud/compute/drivers/openstack.py Thu Apr 26 22:01:08 2012
@@ -1099,3 +1099,17 @@ class OpenStack_1_1_NodeDriver(OpenStack
         path = urlparse.urlparse(location_header).path
         image_id = path.split('/')[-1]
         return image_id
+
+    def ex_rescue(self, node, password=None):
+        # Requires Rescue Mode extension
+        if password:
+            resp = self._node_action(node, 'rescue', adminPass=password)
+        else:
+            resp = self._node_action(node, 'rescue')
+            password = json.loads(resp.body)['adminPass']
+        node.extra['password'] = password
+        return node
+
+    def ex_unrescue(self, node):
+        resp = self._node_action(node, 'unrescue')
+        return resp.status == httplib.ACCEPTED

Modified: libcloud/trunk/test/compute/test_openstack.py
URL: http://svn.apache.org/viewvc/libcloud/trunk/test/compute/test_openstack.py?rev=1331124&r1=1331123&r2=1331124&view=diff
==============================================================================
--- libcloud/trunk/test/compute/test_openstack.py (original)
+++ libcloud/trunk/test/compute/test_openstack.py Thu Apr 26 22:01:08 2012
@@ -840,6 +840,24 @@ class OpenStack_1_1_Tests(unittest.TestC
         params = [("key", "value1"), ("key", "value2") ]
         self.driver.connection.request("/servers/12067", params=params)
 
+    def test_ex_rescue_with_password(self):
+        node = Node(id=12064, name=None, state=None, public_ips=None,
+                    private_ips=None, driver=self.driver)
+        n = self.driver.ex_rescue(node, 'foo')
+        self.assertEqual(n.extra['password'], 'foo')
+
+    def test_ex_rescue_no_password(self):
+        node = Node(id=12064, name=None, state=None, public_ips=None,
+                    private_ips=None, driver=self.driver)
+        n = self.driver.ex_rescue(node)
+        self.assertEqual(n.extra['password'], 'foo')
+
+    def test_ex_unrescue(self):
+        node = Node(id=12064, name=None, state=None, public_ips=None,
+                    private_ips=None, driver=self.driver)
+        result = self.driver.ex_unrescue(node)
+        self.assertTrue(result)
+
 
 class OpenStack_1_1_FactoryMethodTests(OpenStack_1_1_Tests):
     should_list_locations = False
@@ -909,6 +927,9 @@ class OpenStack_1_1_MockHttp(MockHttpTes
             return (httplib.ACCEPTED, "",
                     {"location": "http://127.0.0.1/v1.1/68/images/4949f9ee-2421-4c81-8b49-13119446008b"},
                     httplib.responses[httplib.ACCEPTED])
+        elif "rescue" in json.loads(body):
+            return (httplib.OK, '{"adminPass": "foo"}', {},
+                    httplib.responses[httplib.OK])
 
         return (httplib.ACCEPTED, "", {}, httplib.responses[httplib.ACCEPTED])