You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@libcloud.apache.org by rb...@apache.org on 2010/11/07 16:47:33 UTC
svn commit: r1032303 - in /incubator/libcloud/trunk:
libcloud/drivers/gogrid.py test/fixtures/gogrid/image_save.json
test/test_gogrid.py
Author: rbogorodskiy
Date: Sun Nov 7 15:47:32 2010
New Revision: 1032303
URL: http://svn.apache.org/viewvc?rev=1032303&view=rev
Log:
Add several minor features to GoGrid driver:
- allow to create a 'sandbox' node
- add isSandbox boolean extra property to see if a node
is a sandbox
- add ex_save_image() method for turning node into custom
image
Added:
incubator/libcloud/trunk/test/fixtures/gogrid/image_save.json
Modified:
incubator/libcloud/trunk/libcloud/drivers/gogrid.py
incubator/libcloud/trunk/test/test_gogrid.py
Modified: incubator/libcloud/trunk/libcloud/drivers/gogrid.py
URL: http://svn.apache.org/viewvc/incubator/libcloud/trunk/libcloud/drivers/gogrid.py?rev=1032303&r1=1032302&r2=1032303&view=diff
==============================================================================
--- incubator/libcloud/trunk/libcloud/drivers/gogrid.py (original)
+++ incubator/libcloud/trunk/libcloud/drivers/gogrid.py Sun Nov 7 15:47:32 2010
@@ -74,6 +74,7 @@ GOGRID_INSTANCE_TYPES = {'512MB': {'id':
class GoGridResponse(Response):
+
def success(self):
if self.status == 403:
raise InvalidCredsError('Invalid credentials', GoGridNodeDriver)
@@ -86,15 +87,16 @@ class GoGridResponse(Response):
except ValueError:
raise MalformedResponseError('Malformed reply', body=self.body, driver=GoGridNodeDriver)
- def parse_body(self):
+ def parse_body(self):
if not self.body:
return None
return json.loads(self.body)
def parse_error(self):
- if not self.object:
+ try:
+ return json.loads(self.body)["list"][0]['message']
+ except ValueError:
return None
- return self.object['message']
class GoGridConnection(ConnectionUserAndKey):
"""
@@ -162,7 +164,8 @@ class GoGridNodeDriver(NodeDriver):
state=state,
public_ip=[ip],
private_ip=[],
- extra={'ram': element.get('ram').get('name')},
+ extra={'ram': element.get('ram').get('name'),
+ 'isSandbox': element['isSandbox'] == 'true'},
driver=self.connection.driver)
if password:
n.extra['password'] = password
@@ -264,6 +267,7 @@ class GoGridNodeDriver(NodeDriver):
params = {'name': name,
'image': image.id,
'description': kwargs.get('ex_description', ''),
+ 'isSandbox': str(kwargs.get('ex_issandbox', False)).lower(),
'server.ram': size.id,
'ip': first_ip}
@@ -280,6 +284,8 @@ class GoGridNodeDriver(NodeDriver):
@keyword ex_description: Description of a Node
@type ex_description: C{string}
+ @keyword ex_issandbox: Should server be sendbox?
+ @type ex_issandbox: C{bool}
"""
node = self.ex_create_node_nowait(**kwargs)
@@ -301,3 +307,23 @@ class GoGridNodeDriver(NodeDriver):
raise Exception("Wasn't able to wait for id allocation for the node %s" % str(node))
return node
+
+ def ex_save_image(self, node, name):
+ """Create an image for node.
+
+ Please refer to GoGrid documentation to get info
+ how prepare a node for image creation:
+
+ http://wiki.gogrid.com/wiki/index.php/MyGSI
+
+ @keyword node: node to use as a base for image
+ @param node: L{Node}
+ @keyword name: name for new image
+ @param name: C{string}
+ """
+ params = {'server': node.id,
+ 'friendlyName': name}
+ object = self.connection.request('/api/grid/image/save', params=params,
+ method='POST').object
+
+ return self._to_images(object)[0]
Added: incubator/libcloud/trunk/test/fixtures/gogrid/image_save.json
URL: http://svn.apache.org/viewvc/incubator/libcloud/trunk/test/fixtures/gogrid/image_save.json?rev=1032303&view=auto
==============================================================================
--- incubator/libcloud/trunk/test/fixtures/gogrid/image_save.json (added)
+++ incubator/libcloud/trunk/test/fixtures/gogrid/image_save.json Sun Nov 7 15:47:32 2010
@@ -0,0 +1,62 @@
+{
+ "list": [
+ {
+ "architecture": {
+ "description": "32 bit OS",
+ "id": 1,
+ "name": "32-bit",
+ "object": "option"
+ },
+ "billingtokens": [
+ {
+ "id": 46,
+ "name": "CentOS 5.3 32bit",
+ "object": "billingtoken",
+ "price": 0
+ }
+ ],
+ "createdTime": 1289119839685,
+ "description": "",
+ "friendlyName": "testimage",
+ "id": 5050,
+ "isActive": true,
+ "isPublic": false,
+ "location": "123/GSI-3ee65927-f80d-43df-92df-6c7e352f009c.img",
+ "name": "GSI-3ee65927-f80d-43df-92df-6c7e352f009c",
+ "object": "serverimage",
+ "os": {
+ "description": "CentOS 5.3 (32-bit)",
+ "id": 16,
+ "name": "CentOS 5.3 (32-bit)",
+ "object": "option"
+ },
+ "owner": {
+ "id": 123,
+ "name": "name",
+ "object": "customer"
+ },
+ "price": 0,
+ "state": {
+ "description": "Image is being saved",
+ "id": 1,
+ "name": "Saving",
+ "object": "option"
+ },
+ "type": {
+ "description": "Web or Application Server",
+ "id": 1,
+ "name": "Web Server",
+ "object": "option"
+ },
+ "updatedTime": 1289119839685
+ }
+ ],
+ "method": "/grid/image/save",
+ "status": "success",
+ "summary": {
+ "numpages": 0,
+ "returned": 1,
+ "start": 0,
+ "total": 1
+ }
+}
Modified: incubator/libcloud/trunk/test/test_gogrid.py
URL: http://svn.apache.org/viewvc/incubator/libcloud/trunk/test/test_gogrid.py?rev=1032303&r1=1032302&r2=1032303&view=diff
==============================================================================
--- incubator/libcloud/trunk/test/test_gogrid.py (original)
+++ incubator/libcloud/trunk/test/test_gogrid.py Sun Nov 7 15:47:32 2010
@@ -50,6 +50,7 @@ class GoGridTests(unittest.TestCase, Tes
self.assertEqual(node.id, '90967')
self.assertEqual(node.extra['password'], 'bebebe')
+ self.assertEqual(node.extra['isSandbox'], False)
def test_reboot_node(self):
node = Node(90967, None, None, None, None, self.driver)
@@ -101,6 +102,11 @@ class GoGridTests(unittest.TestCase, Tes
else:
self.fail("test should have thrown")
+ def test_ex_save_image(self):
+ node = self.driver.list_nodes()[0]
+ image = self.driver.ex_save_image(node, "testimage")
+ self.assertEqual(image.name, "testimage")
+
class GoGridMockHttp(MockHttp):
fixtures = FileFixtures('gogrid')
@@ -111,7 +117,8 @@ class GoGridMockHttp(MockHttp):
def _api_grid_image_list_FAIL(self, method, url, body, headers):
body = "<h3>some non valid json here</h3>"
- return (httplib.SERVICE_UNAVAILABLE, body, {}, httplib.responses[httplib.SERVICE_UNAVAILABLE])
+ return (httplib.SERVICE_UNAVAILABLE, body, {},
+ httplib.responses[httplib.SERVICE_UNAVAILABLE])
def _api_grid_server_list(self, method, url, body, headers):
body = self.fixtures.load('server_list.json')
@@ -150,5 +157,9 @@ class GoGridMockHttp(MockHttp):
_api_support_password_list_NOPUBIPS = _api_support_password_list
+ def _api_grid_image_save(self, method, url, body, headers):
+ body = self.fixtures.load('image_save.json')
+ return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
if __name__ == '__main__':
sys.exit(unittest.main())