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/01 20:17:03 UTC

svn commit: r1029795 - in /incubator/libcloud/trunk: libcloud/drivers/rackspace.py test/fixtures/rackspace/v1_slug_limits.xml test/test_rackspace.py

Author: rbogorodskiy
Date: Mon Nov  1 19:17:03 2010
New Revision: 1029795

URL: http://svn.apache.org/viewvc?rev=1029795&view=rev
Log:
Add extra call ex_limits to Rackspace driver to
obtain information about account's limits (such
as allowed request rate or maximum RAM used by
servers).

Added:
    incubator/libcloud/trunk/test/fixtures/rackspace/v1_slug_limits.xml
Modified:
    incubator/libcloud/trunk/libcloud/drivers/rackspace.py
    incubator/libcloud/trunk/test/test_rackspace.py

Modified: incubator/libcloud/trunk/libcloud/drivers/rackspace.py
URL: http://svn.apache.org/viewvc/incubator/libcloud/trunk/libcloud/drivers/rackspace.py?rev=1029795&r1=1029794&r2=1029795&view=diff
==============================================================================
--- incubator/libcloud/trunk/libcloud/drivers/rackspace.py (original)
+++ incubator/libcloud/trunk/libcloud/drivers/rackspace.py Mon Nov  1 19:17:03 2010
@@ -347,3 +347,30 @@ class RackspaceNodeDriver(NodeDriver):
                      driver=self.connection.driver,
                      extra={'serverId': el.get('serverId')})
         return i
+
+    def ex_limits(self):
+        """
+        Extra call to get account's limits, such as
+        rates (for example amount of POST requests per day)
+        and absolute limits like total amount of available
+        RAM to be used by servers.
+        
+        @return: C{dict} with keys 'rate' and 'absolute'
+        """
+        def _to_rate(el):
+            rate = {}
+            for item in el.items():
+                rate[item[0]] = item[1]
+
+            return rate
+
+        def _to_absolute(el):
+            return {el.get('name'): el.get('value')}
+
+        limits = self.connection.request("/limits").object
+        rate = [ _to_rate(el) for el in self._findall(limits, 'rate/limit') ]
+        absolute = {}
+        for item in self._findall(limits, 'absolute/limit'):
+            absolute.update(_to_absolute(item))
+
+        return {"rate": rate, "absolute": absolute}

Added: incubator/libcloud/trunk/test/fixtures/rackspace/v1_slug_limits.xml
URL: http://svn.apache.org/viewvc/incubator/libcloud/trunk/test/fixtures/rackspace/v1_slug_limits.xml?rev=1029795&view=auto
==============================================================================
--- incubator/libcloud/trunk/test/fixtures/rackspace/v1_slug_limits.xml (added)
+++ incubator/libcloud/trunk/test/fixtures/rackspace/v1_slug_limits.xml Mon Nov  1 19:17:03 2010
@@ -0,0 +1,15 @@
+<?xml version="1.0" ?>
+<limits xmlns="http://docs.rackspacecloud.com/servers/api/v1.0">
+	<rate>
+		<limit URI="*changes-since*" regex="changes-since" remaining="3" resetTime="1288636970" unit="MINUTE" value="3" verb="GET"/>
+		<limit URI="*" regex=".*" remaining="10" resetTime="1288636970" unit="MINUTE" value="10" verb="PUT"/>
+		<limit URI="*" regex=".*" remaining="10" resetTime="1288636970" unit="MINUTE" value="10" verb="POST"/>
+		<limit URI="*" regex=".*" remaining="600" resetTime="1288636970" unit="MINUTE" value="600" verb="DELETE"/>
+		<limit URI="/servers*" regex="^/servers" remaining="500" resetTime="1288636970" unit="DAY" value="500" verb="POST"/>
+	</rate>
+	<absolute>
+		<limit name="maxIPGroupMembers" value="25"/>
+		<limit name="maxIPGroups" value="25"/>
+		<limit name="maxTotalRAMSize" value="921600"/>
+	</absolute>
+</limits>

Modified: incubator/libcloud/trunk/test/test_rackspace.py
URL: http://svn.apache.org/viewvc/incubator/libcloud/trunk/test/test_rackspace.py?rev=1029795&r1=1029794&r2=1029795&view=diff
==============================================================================
--- incubator/libcloud/trunk/test/test_rackspace.py (original)
+++ incubator/libcloud/trunk/test/test_rackspace.py Mon Nov  1 19:17:03 2010
@@ -103,6 +103,11 @@ class RackspaceTests(unittest.TestCase, 
         ret = node.destroy()
         self.assertTrue(ret is True)
 
+    def test_ex_limits(self):
+        limits = self.driver.ex_limits()
+        self.assertTrue("rate" in limits)
+        self.assertTrue("absolute" in limits)
+
 class RackspaceMockHttp(MockHttp):
 
     fixtures = FileFixtures('rackspace')
@@ -153,6 +158,10 @@ class RackspaceMockHttp(MockHttp):
         # only used by reboot() right now, but we will need to parse body someday !!!!
         return (httplib.ACCEPTED, "", {}, httplib.responses[httplib.ACCEPTED])
 
+    def _v1_0_slug_limits(self, method, url, body, headers):
+        body = self.fixtures.load('v1_slug_limits.xml')
+        return (httplib.ACCEPTED, body, {}, httplib.responses[httplib.ACCEPTED])
+
     def _v1_0_slug_servers_72258(self, method, url, body, headers):
         if method != "DELETE":
             raise NotImplemented