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 2015/08/08 21:15:14 UTC

[3/4] libcloud git commit: Throw InvalidCredsError on invalid credentials, fix time retrieval from the RunAbove API.

Throw InvalidCredsError on invalid credentials, fix time retrieval from the
RunAbove API.


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

Branch: refs/heads/trunk
Commit: 9e9c6c1cbfc637d6897e91c632cb5cfc6b4823ec
Parents: 483b713
Author: Tomaz Muraus <to...@tomaz.me>
Authored: Sat Aug 8 20:47:25 2015 +0200
Committer: Tomaz Muraus <to...@tomaz.me>
Committed: Sat Aug 8 20:53:17 2015 +0200

----------------------------------------------------------------------
 libcloud/common/runabove.py | 41 +++++++++++++++++++++++++++++++++-------
 1 file changed, 34 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/9e9c6c1c/libcloud/common/runabove.py
----------------------------------------------------------------------
diff --git a/libcloud/common/runabove.py b/libcloud/common/runabove.py
index af839f3..4d45241 100644
--- a/libcloud/common/runabove.py
+++ b/libcloud/common/runabove.py
@@ -22,9 +22,17 @@ try:
 except ImportError:
     import json
 
+from libcloud.utils.py3 import httplib
+from libcloud.utils.connection import get_response_object
+from libcloud.common.types import InvalidCredsError
 from libcloud.common.base import ConnectionUserAndKey, JsonResponse
 from libcloud.httplib_ssl import LibcloudHTTPSConnection
 
+__all__ = [
+    'RunAboveResponse',
+    'RunAboveConnection'
+]
+
 API_HOST = 'api.runabove.com'
 API_ROOT = '/1.0'
 LOCATIONS = {
@@ -43,6 +51,17 @@ class RunAboveException(Exception):
     pass
 
 
+class RunAboveResponse(JsonResponse):
+    def parse_error(self):
+        response = super(RunAboveResponse, self).parse_body()
+
+        if response.get('errorCode', None) == 'INVALID_SIGNATURE':
+            raise InvalidCredsError('Signature validation failed, probably '
+                                    'using invalid credentials')
+
+        return self.body
+
+
 class RunAboveConnection(ConnectionUserAndKey):
     """
     A connection to the RunAbove API
@@ -52,7 +71,7 @@ class RunAboveConnection(ConnectionUserAndKey):
     """
     host = API_HOST
     request_path = API_ROOT
-    responseCls = JsonResponse
+    responseCls = RunAboveResponse
     timestamp = None
     ua = []
     LOCATIONS = LOCATIONS
@@ -83,17 +102,25 @@ class RunAboveConnection(ConnectionUserAndKey):
         }
         httpcon = LibcloudHTTPSConnection(self.host)
         httpcon.request(method='POST', url=action, body=data, headers=headers)
-        response = httpcon.getresponse().read()
-        json_response = json.loads(response)
+        response = httpcon.getresponse()
+
+        if response.status == httplib.UNAUTHORIZED:
+            raise InvalidCredsError()
+
+        body = response.read()
+        json_response = json.loads(body)
         httpcon.close()
         return json_response
 
     def get_timestamp(self):
         if not self._timedelta:
-            action = API_ROOT + '/auth/time'
-            response = self.connection.request('GET', action, headers={})
-            timestamp = int(response)
-            self._time_delta = timestamp - int(time.time())
+            url = 'https://%s/%s/auth/time' % (API_HOST, API_ROOT)
+            response = get_response_object(url=url, method='GET', headers={})
+            if not response or not response.body:
+                raise Exception('Failed to get current time from RunAbove API')
+
+            timestamp = int(response.body)
+            self._timedelta = timestamp - int(time.time())
         return int(time.time()) + self._timedelta
 
     def make_signature(self, method, action, data, timestamp):